Django. Иностранный ключ
У меня есть 2 таблицы:
Side и AdditionalCost
теперь AdditionalCost имеет следующее поле внешнего ключа:
side = models.ForeignKey(Side, on_delete=models.CASCADE, related_name='costs')
Я хочу иметь другое поле внешнего ключа в AdditionalCosts:
number_of_additional_installations = models.ForeignKey(Side, on_delete=models.CASCADE, related_name="number_of_additional_installations")
Модель Side имеет следующее поле:
number_of_additional_installations = models.IntegerField(null=True, blank=True,
db_column='number_of_additional_installations',
verbose_name='Количество доп монтажей')
Но я получаю следующую ошибку:
ERRORS:
<class 'kinetics.apps.address_program.admin.AdditionalCostInline'>: (admin.E202) 'address_program.AdditionalCost' has more than one ForeignKey to 'address_program.Side'.
address_program.AdditionalCost.number_of_additional_installations: (fields.E302) Reverse accessor for 'AdditionalCost.number_of_additional_installations' clashes with field name 'Side.number_of_additional_installations'.
HINT: Rename field 'Side.number_of_additional_installations', or add/change a related_name argument to the definition for field 'AdditionalCost.number_of_additional_installations'.
address_program.AdditionalCost.number_of_additional_installations: (fields.E303) Reverse query name for 'AdditionalCost.number_of_additional_installations' clashes with field name 'Side.number_of_additional_installations'.
HINT: Rename field 'Side.number_of_additional_installations', or add/change a related_name argument to the definition for field 'AdditionalCost.number_of_additional_installations'.
Я не могу понять, почему это произошло, потому что я вижу, что в коде есть такие строки:
buyer_org = models.ForeignKey("acl.Organization", on_delete=models.SET_NULL, null=True, blank=True,
related_name='buyer_costs')
client_org = models.ForeignKey("acl.Organization", on_delete=models.SET_NULL, null=True, blank=True,
related_name='client_costs')
которые, очевидно, являются двумя внешними полями, относящимися к столбцам одной модели.
Если вам нужен полный код моделей, дайте мне знать, он довольно большой, но я могу добавить его, если вам нужно. Спасибо
p.s. Если я переименую related_name в number_of_additional_installations, я все равно получу следующую ошибку:
ERRORS:
<class 'kinetics.apps.address_program.admin.AdditionalCostInline'>: (admin.E202) 'address_program.AdditionalCost' has more than one ForeignKey to 'address_program.Side'.
Это происходит потому, что у вас уже есть
number_of_additional_installations определено в Sides, которое конфликтует со связанным именем, которое вы задали в AdditionalCosts. Либо вы переименуете поле в Sides, либо измените параметр related_name, чтобы Django не запутался, какое поле разрешать.
Этот код:
buyer_org = models.ForeignKey("acl.Organization", on_delete=models.SET_NULL, null=True, blank=True,
related_name='buyer_costs')
client_org = models.ForeignKey("acl.Organization", on_delete=models.SET_NULL, null=True, blank=True,
related_name='client_costs')
- это не тот же случай. Эти поля не вызывают конфликта, потому что они ссылаются на разные отношения, даже если они ссылаются на одну и ту же модель. model.buyer_org и model.client_org возвращают разные отношения. model.buyer_org сопоставляется с organization.buyer_costs, которое исключает model.client_org, которое, в свою очередь, сопоставляется с organization.client_costs.
То, как вы указываете Sides и AdditionalCosts, создает конфликт.
Вы можете вызвать side.number_of_additional_installations, который возвращает целочисленное поле, но в то же время вы говорите django, что additional_costs.number_of_additional_installations map to side.number_of_additional_installations.