使用Django模型继承来克隆表

时间:2016-10-13 08:17:31

标签: django

我有一个用户表,想要创建一个名为deleted_users的备份表,它是用户表的克隆。当用户被删除时,我想将记录从用户表移动到deleted_users表。

class LCUser(models.Model):
    email = models.EmailField(max_length=100,unique=True)
    password = models.CharField(max_length=100)
    first_name = models.CharField(max_length=100)
    last_name=models.CharField(max_length=100)
    class Meta:
        db_table = "user" 

class LCUserDeleted(LCUser):
    deleted_at = models.DateTimeField(auto_now_add=True,null=True)
    class Meta:
        db_table = "deleted_users"

我尝试了如上所述,但这会创建包含所有字段的user表和包含2个字段的deleted_users表(lcusers_ptr_id和deleted_at),如何创建包含所有字段的第2个表而不是逐个输入所有字段?

1 个答案:

答案 0 :(得分:2)

要实现您所寻找的目标,您实际上需要3个模型,一个抽象模型和两个实际模型:

class BaseLCUser(models.Model):
  email = models.EmailField(max_length=100,unique=True)
  password = models.CharField(max_length=100)
  first_name = models.CharField(max_length=100)
  last_name=models.CharField(max_length=100)
  class Meta:
      abstract = True

class LCUser(BaseLCUser):
  class Meta:
    db_table = "user"

class LCUserDeleted(BaseLCUser):
  deleted_at = models.DateTimeField(auto_now_add=True,null=True)
  class Meta:
      db_table = "deleted_users"

通过使用抽象模型作为公共父模板,Django实际上将为每个模型创建完整的表格。

编辑:

关于唯一的电子邮件,您可能希望避免在数据库级别将其设置为唯一,并通过表单进行控制,因为如果您使用电子邮件example@example.org创建和帐户,请删除它,创建另一个一个使用相同的电子邮件和删除而不是新帐户,您将尝试使用相同的电子邮件让两个已删除的用户。

另一种选择是从抽象模型中删除电子邮件字段,并将其放在每个子模型中,仅在未删除的用户中是唯一的。