Django:是否可以通过基本父限制ContentType?

时间:2017-03-16 15:14:54

标签: django django-models orm relational-database

我有一个抽象基类"父母"从中衍生出两个子类" 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是否有任何直截了当的方式?

1 个答案:

答案 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__()]}