使用Django-Polymorphic套件时,如何根据执行个体类型进行筛选?

时间:2019-01-31 06:58:03

标签: django python-2.7 django-1.11 django-polymorphic

使用django-polymorphic时,我不得不创建一个Django查询以根据实例类型进行过滤。

from polymorphic.models import PolymorphicModel

class ClassA(models.Model):
    project = select2.fields.ForeignKey(Project, related_name="class_a")
    some_value = models.FloatField(default=0.0)

class Project(PolymorphicModel):
    topic = models.CharField(max_length=30)

class ArtProject(Project):
    artist = models.CharField(max_length=30)

class ResearchProject(Project):
    supervisor = models.CharField(max_length=30)

如何过滤其项目为“ ArtProject”的ClassA对象?

ClassA.objects.filter(...?)。update(some_value = 0.0)

我试图通过以下方法将其分解:

art_set = ArtProject.objects.all().values_list("project__id", flat=True)
ClassA.objects.filter(id__in=art_set).update(some_value=0.0)

错误:“您无法在FROM子句中指定目标表'ClassA'进行更新”

我也许可以使用,但是我正在尝试过滤一个相关的类...我不确定这是否朝着正确的方向... https://django-polymorphic.readthedocs.io/en/stable/advanced.html#using-enhanced-q-objects-in-any-places

谢谢!

更新: 我可以执行以下操作:

art_set = ArtProject.objects.all()
ClassA.objects.filter(project__in=art_set).update(some_value=0.0)

但是,如果ArtProjects中有许多条目,则转换后的SQL语句将非常长。我不确定ArtProjects包含数千个条目时是否应避免使用“ in”语句。

我一直在研究Q语句,但不确定在这种情况下如何使用它。 https://django-polymorphic.readthedocs.io/en/stable/advanced.html#using-enhanced-q-objects-in-any-places

Q2 = Projects.translate(Q(project__instance_of=ArtProject))
ClassA.objects.filter(Q2).update(some_value=0.0)

但是,我引发了一个异常:(“相关字段的查询无效:instance_of”)

1 个答案:

答案 0 :(得分:0)

看起来有两种方法可以做到:

第一种方法:

art_set = ArtProject.objects.all()
ClassA.objects.filter(project__in=art_set).update(some_value=0.0)

第二种方法:

ClassA.objects.filter(project__artproject__isnull=False).update(some_value=0.0)

希望这对遇到类似问题的其他人有所帮助! 干杯,