我想动态构建Django模型字段的选择列表:
def build_choices(another_model):
choices = DEFAULT_CHOICES
if another_model and another_model.show_extra:
choices = DEFAULT_CHOICES + EXTRA_CHOICES
return choices
class MyOtherModel(models.Model):
show_extra = models.BooleanField(default=False)
class MyModel(models.Model):
another_model = models.ForeignKey(MyOtherModel, blank=True, null=True)
extra_choices = models.CharField(choices=build_choices(another_model))
这显然不起作用,因为build_choices
函数是在加载时进行评估的,并且永远不会进行评估。
我知道我可以在表单类中执行此操作,但是无论是否通过表单或其他方法创建对象,我都希望提供相同的验证。
要注意,动态构建的选择取决于相关的模型实例,如果相关模型不可用(可能是我们第一次实例化MyModel或没有任何another_model关联),则返回默认选择。
我找到了另外一个solution,但似乎有点黑。
我在这里有什么选择?