Python 3.x 使用Django queryset的最佳方法,JSONField!={}
我想要所有使用环境变量有一些密钥对的地方Python 3.x 使用Django queryset的最佳方法,JSONField!={},python-3.x,django,postgresql,django-queryset,postgresql-performance,Python 3.x,Django,Postgresql,Django Queryset,Postgresql Performance,我想要所有使用环境变量有一些密钥对的地方 class JobAnalysis(Base, XYZ): env_vars = JSONField( default=dict ) job = models.ForeignKey( Job, related_name='jobanalyses' ) seller = models.ForeignKey( ABC, null=True ) c
class JobAnalysis(Base, XYZ):
env_vars = JSONField(
default=dict
)
job = models.ForeignKey(
Job, related_name='jobanalyses'
)
seller = models.ForeignKey(
ABC,
null=True
)
class Usage(Base):
job = models.ForeignKey(
Job, null=True, blank=True
)
我使用上面的queryset获取所有使用信息,其中seller为null,env_vars不等于{}
用法查询
但我在这里看到了性能问题,因为.exclude(job\uu jobanalysis\uu env\u vars\uuu exact={})
创建内部查询,并且因为这个select语句是超时的
在seller为null且env_vars!={}
usages_qs = Usage.objects.filter(
job__jobanalyses__seller__isnull=True
).exclude(
job__jobanalyses__env_vars__exact={}
)
SELECT "Usage"."job",
FROM "Usage"
LEFT OUTER JOIN "Job" ON ("Usage"."job_id" = "Job"."id")
LEFT OUTER JOIN "JobAnalysis" ON ("Job"."id" = "JobAnalysis"."job_id")
WHERE ("JobAnalysis"."seller_id" IS NULL
AND NOT ("Usage"."job_id" IN
(SELECT U2."job_id"
FROM "JobAnalysis" U2
WHERE U2."env_vars" = '{}')
AND "Usage"."job_id" IS NOT NULL))