2017-02-21 38 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 

我做了一個django應用程序。
這大致相當於我在我的models.py
我需要m2m關係之間的A和B去通過另一個模型,因爲我需要在那裏存儲額外的數據。
現在有一個問題 - 當我嘗試在我的自定義視圖中保存模型A的實例時,無論我是否選擇它們,都不保存與B B的關係。 當我去http://127.0.0.1:8000/admin,並嘗試從那裏創建A的實例,我甚至沒有看到適當的領域(應該是<select multiple>我猜)選擇關係與B
有人可以解釋我爲什麼關係沒有保存,甚至沒有顯示在/管理?
這裏是代碼大致相當於什麼,我有views.py: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

這是行不通的。如果您使用自己的ManytoMany中介表,則必須手動管理並自行保存對象。使用Django的內置函數將不起作用。

保存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) 

[...]請注意,如果您使用的是中間 模型的許多一對多的關係,一些相關的經理 方法是禁用的,所以其中的一些例子榮獲」 t與這樣的 模型一起工作。

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'字段可以簡單地是'ForeignKey'到AtoB模型。 – Rob

+0

我會使用ManyToMany關係,以防我需要兩個類之間的連接,而這兩個類之間需要與'n' ObjectsB'AND'相關的ObjectA,反之亦然。從某種意義上說,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 –