使用过滤器使用django-polymorphic限制GenericForeignKey模型列表

时间:2015-04-16 07:51:31

标签: python django polymorphism django-contenttypes

我有许多继承自PolymorphicModel(来自django-polymorphic)的Django模型。我想为特定的模型类型及其子模型创建GenericForeignKey关系。

类似的东西:

# application_one/models.py

from django.db import models
from polymorphic import PolymorphicModel
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType

class ModelA(PolymorphicModel):
    name = models.CharField(max_length=100)

class ModelB(ModelA):
    new_property = models.CharField(max_length=100)

class ModelC(ModelA):
    other_property = models.CharField(max_length=100)

class OtherModel(models.Model):
    pass

class ModelWithRelation(models.Model):
     # We want to limit the related_model to ModelA, or it's children
     related_model = models.ForeignKey(ContentType)
     object_id = models.IntegerField()
     content_object = GenericForeignKey('related_model', 'object_id')

---和---

# application_two/models.py
from application_one.models import ModelA

class ModelD(ModelA):
     pass

您可以通过在limit_choices_to中明确指定模型名称来限制ContentType的选择,但我实际上希望这是ModelA的子项的动态查询,因为在我们的应用程序中,我们期望ModelA的子项为存在于其他应用程序中,并且不希望必须在application_one中定义它们。

如何定义Q对象(或我需要做的任何事情)才能在相关对象上设置limit_choices_to(即related_model = models.ForeignKey(ContentType))。

TIA!

1 个答案:

答案 0 :(得分:2)

这是Django Polymorphic的内置功能,您无需创建GenericForeignKey,只需创建常规ForeinKeyModelA,Django Polymorphic将负责其余的。

有关详细信息,请参阅Django Polymorphic's documentation on ForeignKeys