Я думаю, что вы хотите использовать посредническую модель для формирования отношения M2M с помощью ключевого аргумента through
в ManyToManyField. Вроде как первый ответ выше, но больше "Django-y".
class A(models.Model):
name = models.CharField(max_length=200)
class B(models.Model):
a = models.ManyToManyField(A, through='C')
...
class C(models.Model):
a = models.ForeignKey(A)
b = models.ForeignKey(B)
При использовании ключевого слова through
обычные методы манипуляции M2M больше недоступны (это означает add
, create
, remove
или присвоение с оператором =
). Вместо этого вы должны создать саму модель-посредник, например:
>>> C.objects.create(a=a1, b=b)
Однако вы по-прежнему сможете использовать обычные операции запроса для модели, содержащей ManyToManyField
. Другими словами, все еще будет работать следующее:
>>> b.a.filter(a=a1)
Но, может быть, лучшим примером будет что-то вроде этого:
>>> B.objects.filter(a__name='Test')
Пока поля FK в промежуточной модели не обозначены как unique
, вы сможете создавать несколько экземпляров с одинаковыми FK. Вы также можете прикрепить дополнительную информацию об отношениях, добавив любые другие поля, которые вам нравятся, к C
.
Промежуточные модели задокументированы здесь .