使用 Django-Polymorphic 包时如何根据实例类型进行过滤?

Posted

技术标签:

【中文标题】使用 Django-Polymorphic 包时如何根据实例类型进行过滤?【英文标题】:How do I filter based on instance type when using Django-Polymorphic package? 【发布时间】:2019-06-24 13:59:40 【问题描述】:

在使用 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)

如果 ClassA 的项目是“ArtProject”,我该如何过滤?

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)

但是,我遇到了一个异常:('Related Field got invalid lookup: instance_of',)

【问题讨论】:

也许这个答案可以帮助你***.com/a/22675773/2484882 【参考方案1】:

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

第一种方法:

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)

希望这可以帮助遇到类似问题的其他人! 干杯,

【讨论】:

以上是关于使用 Django-Polymorphic 包时如何根据实例类型进行过滤?的主要内容,如果未能解决你的问题,请参考以下文章

dubbo在丢数据包时如何处理消息

Fiddler无法抓包时如何处理

使用 QNetworkAccessManager 时如何处理代理

使用 UIKeyCommand 时如何处理大小写字符

使用 ActiveMerchant 时如何处理超时?

使用 Kafka Streams DSL 时如何处理错误和不提交