我有一个抽象基类"父母"从中衍生出两个子类" Child1"和" Child2"。每个孩子都可以拥有一套状态"。 我使用" ContentType"," GenericForeignKey"和#34; GenericRelation"像这样:
from django.db import models
from django.contrib.contenttypes.generic import GenericRelation, GenericForeignKey
from django.contrib.contenttypes.models import ContentType
class Parent(models.Model):
name = models.CharField(max_length=30, blank=True)
class Meta:
abstract = True
def __str__(self):
return self.name
class Child1(Parent):
id_camp = models.PositiveIntegerField()
config_type = models.CharField(max_length=30)
status_set = GenericRelation(Status)
class Child2(Parent):
temperature = models.FloatField(null=True, blank=True)
status_set = GenericRelation(Status)
class Status(models.Model):
code = models.CharField(max_length=10, null=True, blank=True)
message = models.CharField(max_length=100, null=True, blank=True)
content_type = models.ForeignKey(ContentType, limit_choices_to={'name__in': ('child1', 'child2',)}, null=True, blank=True)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
实际解决方案工作正常,但现在内容类型选择的限制是通过" name"最后我将在稍后创建更多子语句。我想用limit_choices_to={'name__in': ('child1', 'child2',)}
之类的东西替换limit_choices_to children of parent
是否有任何直截了当的方式?
答案 0 :(得分:1)
limit_choices_to
也接受callables,所以是的,动态值应该是可能的:
可以使用字典,Q对象或返回字典或Q对象的可调用对象。
所以这些方面应该有用:
def get_children():
return {'model__in': [c.__name__ for c in Parent.__subclasses__()]}
然后再......
limit_choices_to=get_children
甚至在一行中:
limit_choices_to={'model__in': [c.__name__ for c in Parent.__subclasses__()]}