首页 文章

Django将`choices`添加到继承的模型字段中

提问于
浏览
3

使用多表继承,我有两个模型:

class Bird(models.Model):
    color = models.CharField()

class Bluebird(Bird):
    ...

使用这些模型,我可以这样做:

birds = Bird.objects.all()
for bird in birds:
    print bird.color

这非常简单,但我不喜欢在某些情况下允许人们定义任意颜色值 . 例如,我想阻止用户创建 Bluebird 对象,其颜色字段设置为除 "blue" 之外的任何其他对象,或者在极少数情况下, "grey""brown" . 换句话说,我想在 Bluebird 模型中的继承的 color 字段上设置 choices kwarg . 从粗略的互联网搜索来看,似乎Django目前不允许模型子类覆盖父类的字段 .

在定义子类中可接受的选项时,如何保留对父类中 color 字段的访问权限?

编辑:这个问题集中在Django <1.8 . 在1.8中,添加了为字段的 choices kwarg传递callable的能力,虽然这样很好,但是我还没有升级,升级目前不是一个选项 .

1 回答

  • 0

    使用 property .

    您可以为每个模型定义颜色值,然后将其作为属性返回,如果颜色将被修复,则在数据库中不需要它 .

    class Bird(models.Model):
       COLOR = None
    
       @property
       def color(self):
           return self.COLOR
    
    class BlueBird(Bird):
       COLOR = 'Blue'
    
    >>> b = BlueBird()
    >>> b.color
    'Blue'
    

相关问题