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

use*_*630 5 django inheritance overriding django-models multi-table-inheritance

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

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

class Bluebird(Bird):
    ...
Run Code Online (Sandbox Code Playgroud)

使用这些模型,我可以做到这一点:

birds = Bird.objects.all()
for bird in birds:
    print bird.color
Run Code Online (Sandbox Code Playgroud)

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

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

编辑:这个问题的重点是 Django < 1.8。在 1.8 中,添加了为字段的choiceskwarg传递可调用的功能,虽然这很好,但我正在处理尚未升级的系统,升级目前不是一种选择。

Ray*_*nda -1

使用属性。

您可以为每个模型定义颜色值,然后将其作为属性返回,如果颜色是固定的,则不需要在数据库中使用它。

class Bird(models.Model):
   COLOR = None

   @property
   def color(self):
       return self.COLOR

class BlueBird(Bird):
   COLOR = 'Blue'

>>> b = BlueBird()
>>> b.color
'Blue'
Run Code Online (Sandbox Code Playgroud)