使用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”)
答案 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)
希望这对遇到类似问题的其他人有所帮助! 干杯,