【问题标题】:Filtering a ContentType ForeignKey using django-polymorphic使用 django-polymorphic 过滤 ContentType ForeignKey
【发布时间】:2015-04-17 06:23:51
【问题描述】:

我有一堆继承自 django-polymorphic 的多态模型的 Django 模型。在另一个模型中,我有一个与 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_object_type 以便只有 MagicObjectA 和 MagicObjectB 可供选择。

我试过像这样使用limit_choices_to

magic_object_type = models.ForeignKey(ContentType, limit_choices_to=Q(polymorphic_ctype=ContentType.objects.get_for_model(MagicBaseModel)))

但是,您似乎无法在模型初始化期间执行该查询,因为 ContentType 模型尚未准备好。

有什么更好的方法可以解决这个问题吗?

【问题讨论】:

    标签: python django django-models django-admin


    【解决方案1】:

    我会尝试以下方法,灵感来自这里:Choose queryset for limit_choices_to based on object fields:

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

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

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

    像这样:

    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}
    

    在你的字段声明中你可以引用这个函数,像这样:

    magic_object_type = models.ForeignKey(ContentType, limit_choices_to=get_choices)
    

    【讨论】:

      猜你喜欢
      • 2014-05-05
      • 1970-01-01
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-12
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多