姜戈。外键

Django. Foreign key

我有 2 个表:

边和附加成本

现在 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。如果我重命名 number_of_additional_installations 的 related_name,我仍然会收到以下错误:

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_installationsSides 中定义,与您在 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_orgmodel.client_orgreturns不同的关系。 model.buyer_orgorganization.buyer_costs 的映射不包括 model.client_org,而 model.client_org 又映射到 organization.client_costs.

尽管会产生冲突,但您指定 SidesAdditionalCosts 的方式发生了什么。

您可以调用 side.number_of_additional_installations,其中 returns 是一个整数字段,但同时您告诉 django additional_costs.number_of_additional_installations 映射到 side.number_of_additional_installations.