使用Djangompolymorphi过滤ContentType ForeignKey

2024-09-30 12:16:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一堆Django模型,它们继承了Django polymorphic的多态模型。在另一个模型中,我有一个与ContentType的ForeignKey关系,我想将它限制为从特定基类继承的模型。在

示例:

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

class MagicBaseModel(PolymorphicModel):
    def do_magic(self):
        # ...

class MagicObjectA(MagicBaseModel):
    def do_magic(self):
        super(MagicObjectA, self).do_magic(self)
        # ...

class MagicObjectB(MagicBaseModel):
    def do_magic(self):
        super(MagicObjectB, self).do_magic(self)
        # ...

class NonMagicObject(models.Model):
    # ...

class MagicAction(models.Model):
    magic_object_type = models.ForeignKey(ContentType)
    # ...

在上面的例子中,我想限制MagicAction.magic_对象类型因此只有MagicObjectA和MagicObjectB可供选择。在

我试过像这样使用limit_choices_to

^{pr2}$

但是,在模型初始化期间似乎不能执行该查询,因为ContentType模型还没有准备好。在

有什么更好的办法让我处理这个问题吗?在


Tags: djangofrom模型importselfmodelsdefmagic
1条回答
网友
1楼 · 发布于 2024-09-30 12:16:01

我将尝试以下方法,从这里得到启发:Choose queryset for limit_choices_to based on object fields

您对这两种内容类型的查询还不能在ForeignKey函数中求值,因为数据库还没有准备好。在

因此,您需要改用一个函数,它将在需要时为您获取两个选项。在

然后,在该函数中,您可以过滤内容类型实例的“model”字段。在

是这样的:

def get_choices():
    query_a = ContentType.objects.filter(
        model=ContentType.objects.get_for_model(MagicObjectA).model)
    query_b = ContentType.objects.filter(
        model=ContentType.objects.get_for_model(MagicObjectB).model)
    return {'magic_object_type': query_a | query_b}

您可以在字段声明中引用此函数,如下所示:

^{pr2}$

相关问题 更多 >

    热门问题