【问题标题】:How to remove unique constraint for a model attribute of an abstract model after inheritance?继承后如何删除抽象模型的模型属性的唯一约束?
【发布时间】:2015-02-04 06:11:17
【问题描述】:

我有一个抽象类:

class AbstractExecutive(models.Model):
    mobile = models.CharField(max_length=10,unique=True,
                              verbose_name='*Mobile')

   #other attributs not required....
    class Meta:
        abstract = True

我继承这个类来创建不同的实例,如客户端、供应商等。对于类实例客户端,我要求删除唯一约束,而其他类对象存在唯一约束。我正在使用 postgresql 9.1 我使用 psql 删除了客户端表约束,但是由于模型是继承的,因此它始终具有唯一约束。请注意,客户表有数据,不能被打扰。如何摆脱表中的约束。客户端类模型:

class Client(AbstractAddress,AbstractExecutive):

    number = models.CharField(max_length=10,verbose_name='number',
                                  unique=True)
    #other attributes...

【问题讨论】:

    标签: python django postgresql


    【解决方案1】:

    您可以尝试覆盖Client 的继承mobile 字段:

    class Client(...):
        ...
    Client._meta.get_field('mobile')._unique = False
    

    【讨论】:

    • stackoverflow.com/users/165603/okm 您的解决方案也适用于来自stackoverflow.com/users/119071/serafeim 的解决方案,谢谢。但我认为你的选择比玩桌子更好。
    • 出于好奇,这是否也可以通过在具体模型的模型元类中定义唯一性约束并将其排除在抽象模型类之外来完成,例如。通过 unique_together = ('fieldname',)。
    【解决方案2】:

    不幸的是,这在 django (https://docs.djangoproject.com/en/dev/topics/db/models/#field-name-hiding-is-not-permitted) 中是不可能的。您需要从抽象类中删除 mobile 并将其放入具体类(有或没有 unique)。

    【讨论】:

    • @stackoverflow.com/users/119071/serafeim 删除抽象类,并在现有的具有相同属性名称的客户端类上添加属性,会影响客户端模型的“移动”属性的现有数据吗?提前谢谢
    • 如果将mobile字段的定义复制粘贴到继承类,数据库字段将完全相同。所以不用担心,去做吧(我已经顺利完成了——而且,如果你这样做,也不会创建新的迁移)。
    【解决方案3】:

    也许旧的 Django 版本不可能,但现在的解决方案是重新定义子类的属性,没有 unique=True 约束。

    因此,在给定的示例中,AbstractExecutive 抽象模型中的唯一 mobile 属性不能是 Client 模型中的 unique

    你的抽象类:

    class AbstractExecutive(models.Model):
        mobile = models.CharField(max_length=10, unique=True,
                                  verbose_name='*Mobile')
    
       #other attributs not required....
        class Meta:
            abstract = True
    

    子非抽象类:

    class Client(AbstractAddress, AbstractExecutive):
        mobile = models.CharField(max_length=10, verbose_name='*Mobile')
    
        #other attributes...
    

    生成迁移时,unique 约束将在 Client 模型中删除。

    【讨论】:

      猜你喜欢
      • 2021-08-15
      • 2013-10-21
      • 1970-01-01
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 2023-03-05
      相关资源
      最近更新 更多