Модель имеет два отношения «многие ко многим» через промежуточную модель - PullRequest
2 голосов
/ 06 марта 2020

У меня есть модель, которая имеет 2 отдельных отношения ManyToManyField обратно к себе

class Company(models.Model):
    parent          =     models.ManyToManyField("self", through='CompanyParent', through_fields=('company_child', 'company_parent'), related_name='+')
    child           =     models.ManyToManyField("self", through='CompanyParent', through_fields=('company_parent', 'company_child'), related_name='+')

Вышеописанное прекрасно работает на моем localhost Django v3.0.2 / SQLite 3.8.7.2

To на самом деле опубликовал sh это, мне пришлось использовать Django v2.1.15 / SQLite 3.7.17, но в опубликованной версии он выкидывает следующие ошибки

companies.Company.child : (fields.E332) Поля «многие ко многим» с промежуточными таблицами не должны быть симметричными.

companies.Company.parent: (fields.E332) Поля «многие ко многим» с промежуточными таблицами не должны быть симметричными .

companies.Company: (models.E003) Модель имеет два отношения «многие ко многим» через промежуточную модель «companies.CompanyParent».

Что здесь происходит? Решил первые 2 проблемы, добавив symmetrical=False к каждой модели, но не знаю, как решить последнюю ошибку?

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Вы можете проверить этот ответ , чтобы установить два отношения «многие ко многим».

Пример из упомянутого ответа:

class Person(models.Model): 
    name = models.CharField(max_length=127, blank=False)
    to_users = models.ManyToManyField(
        'self', 
        symmetrical=False, 
        related_name='from_users',
        through='Event', 
        through_fields=('from_user', 'to_user'),
    )

class Event(models.Model):
    item = models.ForeignKey(Item, related_name='events')
    from_user = models.ForeignKey(Person, related_name='events_as_giver')
    to_user = models.ForeignKey(Person, related_name='events_as_receiver')
1 голос
/ 07 марта 2020

В случае, если кто-то сталкивается с той же проблемой; Выше ответ - но я подумал, что я бы немного расширился после внесения необходимых изменений в свой собственный проект

Если вы хотите иметь множество «многие ко многим» в одной и той же модели и если вы используете версию Django после 2.2a1, тогда лучший метод - тот, который подробно описан в моем вопросе; две разные модели, которые вы можете легко вызвать на представления или шаблоны; например -

> data.manytomany1
> data.manytomany2

Однако до 2.2a1 у вас будут проблемы. Для меня это потому, что на cPanel у меня есть для использования Django v2.1.15 из-за более старого используемого SQLite 3.7.17. Это означает, что вы можете иметь только один ManyToManyField (см. Выше) и использовать фильтр, чтобы получить 2-е множество данных. Вы сможете сделать это только в views.py

Надеюсь, что имеет смысл

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...