使用Django模型继承克隆表

使用Django模型继承克隆表,django,Django,我有一个用户表,想创建一个名为deleted_users的备份表,它是用户表的克隆。当用户被删除时,我想将记录从user表移动到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

我有一个用户表,想创建一个名为deleted_users的备份表,它是用户表的克隆。当用户被删除时,我想将记录从user表移动到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"

我如上所述尝试过,但这会创建一个包含所有字段的用户表和一个包含2个字段的已删除用户表(lcusers\u ptr\u id和deleted\u at),我如何创建包含所有字段的第二个表而不逐个键入所有内容?

要实现您想要的功能,您实际上需要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,删除它,创建另一个具有相同电子邮件的用户,然后删除新帐户,您将尝试使用相同电子邮件删除两个用户


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

要实现所需功能,您实际上需要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,删除它,创建另一个具有相同电子邮件的用户,然后删除新帐户,您将尝试使用相同电子邮件删除两个用户


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

我认为这是一种糟糕的设计。为什么要为几乎完全相同的结构设置单独的表?为什么不在字段中有一个带有
deleted_的表,如果该字段为
None
,则不会删除用户,反之亦然。假设每个记录都是系统中的用户。如果用户被删除并尝试使用其电子邮件创建同一用户,则将不允许,因为电子邮件必须是唯一的。有没有更好的方法来处理这种情况?@WilletteLynch:Django已经有了一个“Is_active”字段,如果该字段变为False,则该用户将被视为非活动用户。如果您在系统中的某个位置有用户的外键,当用户处于非活动状态/被删除时,该数据是否会全部消失?“电子邮件必须是唯一的”,这将给您带来比预期更多的麻烦,如果我创建一个帐户,删除它,使用相同的电子邮件创建另一个帐户,您认为会发生什么,而且删除了不止一个?看,我认为这是一个糟糕的设计。为什么要为几乎完全相同的结构设置单独的表?为什么不在
字段中有一个带有
deleted_的表,如果该字段为
None
,则不会删除用户,反之亦然。假设每个记录都是系统中的用户。如果用户被删除并尝试使用其电子邮件创建同一用户,则将不允许,因为电子邮件必须是唯一的。有没有更好的方法来处理这种情况?@WilletteLynch:Django已经有了一个“Is_active”字段,如果该字段变为False,则该用户将被视为非活动用户。如果您在系统中的某个位置有用户的外键,当用户处于非活动状态/被删除时,该数据是否会全部消失?“电子邮件必须是唯一的”,这将给您带来比预期更多的麻烦,如果我创建一个帐户,删除它,使用相同的电子邮件创建另一个帐户,您认为会发生什么,并删除多个?请参阅,谢谢。你认为我的设计有缺陷吗?有没有一种更好的/更简单的方法来完成这项工作?@ WilletteLynch,虽然这绝对不是最好的方式,但我不知道这个项目的发展有多先进,所以如果可能的话,你应该至少考虑使用逻辑删除,看看它是否破坏了现有项目的太多,值得重构。谢谢。你认为我的设计有缺陷吗?有没有一种更好的/更简单的方法来完成这项工作?@ WilletteLynch,虽然这绝对不是最好的方式,但我不知道这个项目的发展有多先进,所以如果可能的话,你至少应该考虑使用逻辑删除,看看它是否破坏了现有项目太多,值得重构。