重复使用 Django 模型

5
我有一个应用程序,其中包含许多模型和模板,用于执行某个任务(称为“用户访问审查”,但这不重要-该应用程序称为“uar”)。当用户完成他们的任务后,我们希望将来自主要模型的数据存档到我们所谓的“历史”表中。这些表与原始“uar”表在结构上完全相同,但可以存在于另一个数据库中或可能存在于同一数据库中。但是,除了将它们归档到这些历史表中的进程,以及可能在若干年后过期项目的任务之外,它们将是只读的。
由于我想要完全相同的模型结构但不同的名称,因此我认为我可以创建一个名为“uar_history”的应用程序,并在两个应用程序之间创建models.py文件的符号链接。但是,当我尝试syncdb新模型时,会出现大量关于模型验证失败的投诉,因为在外键上有related_name后链接。
有更好的方法吗?我应该将所有我的存档表作为模型类的子类吗?

2
我会使用一个抽象模型来保存字段,然后为“常规”模型和“历史”模型定义具体类。这样可以让您灵活地轻松添加新字段到两个模型中,或者只针对一个模型添加特定字段。 - Brandon Taylor
1个回答

4

@Brandon给出了正确答案,你应该使用通用的抽象模型来定义共享内容。这些模型可以在同一个文件中或者不同的模型文件中(我为这个例子选择了commoncurrenthistory这三个应用程序):

common/models.py

class CommonPostModel(models.Model):
    title = models.CharField(max_length=255)
    body = models.TextField()

    class Meta:
        abstract = True

current/models.py

class CurrentPostModel(CommonPostModel):
    pass

history/models.py

class ArchivePostModel(CommonPostModel):
    pass

不幸的是,这对于外键关系不起作用。当我将与其他常见模型的外键共有的字段进行匹配时,在实例化历史记录时,会出现“CommonPerson未安装或为抽象”的错误提示。 - Paul Tomblin
看起来解决外键问题的方案要么是使用GenericForeignKey,这可能需要对我的现有代码进行太多更改,要么是将所有ForeignKey字段从抽象的models.py中移出并放到具体的模型中,这会破坏抽象的models.py的美感和DRY原则。嗯…… - Paul Tomblin
它可以与“ForeignKeys”一起使用,但您不能使用related_name(您需要让它自动确定反向名称)。 - Kevin Stone
我必须使用related_name,因为在同一个模型中有多个外键 - 例如,我需要跟踪谁正在接受审查,以及他们汇报给谁,以及谁进行了审查,这些都是指向同一个“人”表的FK。 - Paul Tomblin
Related_name 接受字符串格式,因此您可以查看抽象模型字段是否适用。请参见 https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-related-name - Kevin Stone
不行,如果另一个类是抽象基类,使用ForeignKeys仍然无法工作。因此,我的CommonPerson抽象基类不能有一个指向CommonReview的外键,并期望ReviewPerson将FK指向UARReview,而HistoricalPerson将FK指向HistoricalReview。恐怕我必须在具体类中放置所有的FK。 - Paul Tomblin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接