gpt4 book ai didi

python - 将 Django RawQuerySet 转换为查询集

转载 作者:太空狗 更新时间:2023-10-30 00:29:00 27 4
gpt4 key购买 nike

我有 2 个 Django 模型,ModelA 和一个 ArrayField 用于存储大量主键值列表(可能超过 50k 个列表)

class ModelA(models.Model):
pk_values = ArrayField(models.IntegerField())

class CustomManager(manager.Manager):

def get_for_index(self, index_id):
qs = self.get_queryset()
obj = ModelA.objects.get(pk=index_id)
return qs.filter(id__in=obj.pk_values)

class ModelB(models.Model):
# [...] some fields

objects = CustomManager()

这个有效:

qs = ModelB.objects.get_for_index(index_id=1)

但是,如果“pk_values”是一个大列表,这会非常慢。

所以我尝试执行原始 SQL 查询:

class CustomManager(manager.Manager):
def get_for_index(self, index_id):
qs = self.get_queryset()
sql = "SELECT * FROM myapp_model_b JOIN myapp_model_a ON myapp_model_b.id = ANY(myapp_model_a.pk_values) WHERE myapp_model_a.id = '%s'" % index_id
return qs.raw(sql)

但这会返回一个 django.db.models.query.RawQuerySet 实例。

但是有了这个,之后我就不能做 queryset.values() 之类的事情了。

如何将其转换为普通的 Django 查询集?

有更好的方法吗?

文档:

最佳答案

您可以使用 RawSQL表达式:

ModelB.objects.filter(id__in=RawSQL(
'SELECT unnest(a.pk_values) FROM app_modela a WHERE a.id = %s',
[index_id]
))

或者,您可以使用 extra() 重现问题中的确切查询。 :

ModelB.objects.extra(
tables=['foo_modela'],
where=[
'"app_modelb"."id" = ANY("app_modela"."pk_values")',
'"app_modela"."id" = %s',
],
params=[index_id],
)

关于python - 将 Django RawQuerySet 转换为查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48288076/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com