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
.