我可以在一个 Django ORM 抽象模型中为同一个表声明两个外键吗?

问题描述 投票:0回答:1

你能告诉我是否可以在同一个抽象模型中的同一个表中声明两个ForeignKey? 我能做到:

class TrackableDateModel(models.Model):
    """Abstract model to Track the creation/updated date for a model."""""
    create_date = models.DateTimeField(auto_now_add=True, help_text="Creation time", verbose_name="Created", null=True, blank=True)
    create_user = models.ForeignKey(User, related_name="create_user", on_delete=models.CASCADE, help_text="Who created", verbose_name="Author", null=True, blank=True)
    update_date = models.DateTimeField(auto_now=True, help_text="Time of change", verbose_name="Changed", null=True, blank=True)

    class Meta:
        abstract = True


class A(TrackableDateModel):
    ....

class B(TrackableDateModel):
    .....

但无法添加到 TrackableDateModel:

    update_user = models.ForeignKey(User, related_name="update_user", on_delete=models.CASCADE, help_text="Who modified", verbose_name="Author of change", null=True, blank=True)

因为 makemigrations 发誓。

ERRORS:
DjModule.A.create_user: (fields.E304) Reverse accessor 'User.create_user' for 'DjModule.A.create_user' clashes with reverse accessor for DjModule.B.create_user'.
        HINT: Add or change a related_name argument to the definition for 'DjModule.A.Export4Payment.create_user' or 'DjModule.B.create_user'.

然后崩溃...

python-3.x django postgresql django-models django-orm
1个回答
0
投票

TLDR:您可以执行此操作,但不能使用 fixed

related_name=…
 [Django-doc]。您可以使用
%(class)s
%(app_label)s
使
related_name=…
项变得唯一,如 小心相关名称和相关查询名称部分[Django-doc]中所述。

问题中的建模不起作用的原因是因为

related_name
reverse中关系的名称,因此从
User
TrackableDateModel
的子类(或一般的后代)。现在,如果那是
create_user
,那么
some_user.create_user.all()
会做什么?应该选择哪个型号?

您可以建立不同的关系,每个关系都有不同的名称,例如:

class TrackableDateModel(models.Model):
    'Abstract model to Track the creation/updated date for a model.'
    create_date = models.DateTimeField(
        auto_now_add=True,
        help_text='Creation time',
        verbose_name='Created',
        null=True,
        blank=True,
    )
    create_user = models.ForeignKey(
        User,
        related_name='created_%(class)ss',
        on_delete=models.CASCADE,
        help_text='Who created',
        verbose_name='Author',
        null=True,
        blank=True,
    )
    update_date = models.DateTimeField(
        auto_now=True,
        help_text='Time of change',
        verbose_name='Changed',
        null=True,
        blank=True,
    )

那么

User
模型将具有额外的属性
.created_as
.created_bs


注意:通常使用

settings.AUTH_USER_MODEL
 [Django-doc] 来引用用户模型比使用
User
模型 [Django- doc]
直接。有关更多信息,您可以参阅文档的引用
User
模型
部分[Django-doc]

© www.soinside.com 2019 - 2024. All rights reserved.