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.

Вернуться на верх