2017-02-21 7 views
0
class A(Model): 
    to_b = ManyToManyField('B', blank=True, through='AtoB') 

class B(Model): 
    to_a = ManyToManyField('A', blank=True, through='AtoB') 

class AtoB(Model): 
    a = ForeignKey('A', on_delete=CASCADE) 
    b = ForeignKey('B', on_delete=CASCADE) 
    usr = ForeignKey(settings.USER, on_delete=CASCADE) 
    # some other fields 

임장 애플리케이션을 만드는 중입니다.
이것은 대략 내 models.py에있는 것과 같습니다.
거기에 추가 데이터를 저장해야하기 때문에 A와 B 사이에 m2m 관계가 있어야 다른 모델을 통과해야합니다.
지금 문제가 있습니다 - 모델 의 인스턴스를 내 사용자 정의보기에 저장하려고 시도 할 때 B 인스턴스와의 관계는 내가 선택했는지 여부에 관계없이 저장되지 않습니다. 그리고 http://127.0.0.1:8000/admin에 가서 의 인스턴스를 만들려고 할 때 과의 관계를 선택하기 위해 적절한 필드 (심지어 <select multiple>이어야합니다)가 표시되지 않습니다.
관계가 저장되지 않고/admin에 표시되지 않는 이유를 설명해 줄 수 있습니까?m2m 관계가 표시되지 않거나 django에 저장됩니다.

class Create(CreateView): 
    model = None # A or B 
    template_name = 'something.html' 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     form.save() 
     return HttpResponseRedirect(self.get_success_url()) 

urls.py에서 나는 다음과 같이 추가 인수를 지정합니다 : 작동하지 않을 views.Create.as_view(model=models.A, fields=['to_b'])

+0

코드의 조각을 공유하시기 바랍니다. –

+0

완료되었습니다. – Rob

답변

1

여기
내가 views.py에있는 것과 거의 비슷 코드입니다. 고유 한 ManytoMany 중개 테이블을 사용하는 경우 개체를 수동으로 관리하고 저장해야합니다. 장고의 내장 함수를 사용하면 작동하지 않습니다.

저장 Object A 다음에 Object B을 저장하고 AtoB 테이블 (개체이기도 함)에 관계를 저장하십시오.

a_to_b = AtoB.objects.create(a=object_a, b=object_b, user=self.request.user) 
print(a_to_b) 

[...] '당신이 다 대다 관계에 대한 중간 모델을 사용하는 경우, 관련 관리자의 방법 중 일부는 그래서이 예제 중 일부는 원 비활성화되어 있습니다 그러한 모델로 작업 할 필요가 없습니다.

https://docs.djangoproject.com/en/1.10/topics/db/examples/many_to_many/

귀하의 오류가 여기에 설명 :이 관계를 만들려고 할 경우 https://docs.djangoproject.com/en/1.10/topics/db/models/#intermediary-manytomany

+1

을 참조하십시오. 이 경우 m2m 필드를 만들면 어떤 점이 있습니까? 'to_a '와'to_b' 필드 모두 AtoB 모델에 대해 단순히'ForeignKey '일 수 있음을 의미합니다. – Rob

+0

ObjectA가'n' ObjectsB'AND'와 관련이있는 두 클래스 사이에 연결이있는 경우 ManyToMany 관계를 사용합니다. 어떤 점에서, ManyToMany 관계는 다른 테이블에 대한 ForeinKey 일 뿐이지 만 Django가 제공하는 추상화 수준은 높으며 이러한 개체를 관리하는 것이 더 빠르고 덜 고통 스럽습니다. 예를 들어,'object_a.to_b_set.add (* QuerySet [])'로 오브젝트를 대량 추가 할 수 있습니다. 또한이 필드에'related_name'을 추가하여보다 쉽게 ​​만들 수 있습니다. https://docs.djangoproject.com/en/1.10/ref/models/relations/#django.db.models.fields.related.RelatedManager.add –