你能告诉我是否可以在同一个抽象模型中的同一个表中声明两个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'.
然后崩溃...
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
等
[Django-doc] 来引用用户模型比使用settings.AUTH_USER_MODEL
模型 [Django- doc]直接。有关更多信息,您可以参阅文档的引用User
模型部分[Django-doc]。User