2017-01-25 2 views
3

Я пытаюсь создать модель со многими и многими отношениями с самим собой, и это отношение также будет иметь определенную таблицу, в которой будет храниться некоторая информация об отношениях, но я В некоторых проблемах.Почему многие для многих отношений с самим собой не могут быть симметричными

Я попытался сделать много разных отношений с различными моделями, например, Django docs, и он отлично работает в какой-то другой точке моего приложения. Но теперь я попытался сделать что-то вроде этого:

Предположим, что я хочу модель, представляющую объект (называемый Item), который создается другими элементами, а также используется для создания некоторых других элементов. Например, объект Дверь сделан деревом и замком, но Дверь также будет использоваться для создания Дома. Я думал, что в чем-то, как это для моих моделей

class Item(models.Model): 
    name = models.CharField(max_length=100) 
    items = models.ManyToManyField("self",through='IsMadeBy') 

class IsMadeBy(models.Model): 
    itemResult = models.ForeignKey('Item', related_name='itemResult') 
    itemPart = models.ForeignKey('Item', related_name='itemPart') 
    amountUsed = models.PositiveIntegerField() 

Я получаю сообщение об ошибке:

Many-to-many fields with intermediate tables must not be symmetrical. 

Итак, добавив аргумент

symmetrical=False 

в моих отношениях останавливает ошибка.

С учетом сказанного, я хочу знать, как это действительно работает под капотом. Что же означает, что симметричное означает в этом контексте уровень базы данных? Я был бы признателен, если бы кто-нибудь мог привести примеры, возможно, используя SQL-заявления, так как сейчас мой мозг не может видеть общую ситуацию и действительно изучать эту концепцию симметричных отношений во многих отношениях с самим собой.

ответ

0

Посмотрите на документы Django: https://docs.djangoproject.com/en/1.10/ref/models/fields/#django.db.models.ManyToManyField.symmetrical

С симметричной связи, если я твой друг, то вы мой друг тоже - с точки зрения Django, у вас есть одно отношение.

С несимметричными прямыми и обратными отношениями могут быть разные, у вас есть related_set. Например, если я - ваш менеджер, вы не мой менеджер одновременно, но менеджер через employee_set может иметь много сотрудников.