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

Im делает приложение для django.
Это примерно эквивалентно тому, что у меня есть в моих моделях.py
Мне нужно отношение m2m между A и B, чтобы пройти через другую модель, потому что мне нужно хранить там дополнительные данные.
Теперь возникает проблема - когда я пытаюсь сохранить экземпляр модели A в моем пользовательском представлении, отношения с B экземпляры не сохраняются независимо от того, выбираю я их или нет. И когда я иду http://127.0.0.1:8000/admin и попытаться создать экземпляр А оттуда, я даже не видеть собственное поле (должно быть <select multiple> я думаю) для выбора отношений с B.
Может кто-нибудь объяснить мне, почему отношения не сохраняются и даже не отображаются в/admin?
Вот код примерно соответствует тому, что я имею в 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 в случае, если у меня была связь между двумя классами, для которой ObjectA должен был бы связываться с 'n' ObjectsB' AND' наоборот. В некотором смысле отношение 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 –

 Смежные вопросы

  • Нет связанных вопросов^_^