如何强制 Django 使用 "JOIN VALUES"

How to enforce Django to use "JOIN VALUES"

我遇到性能问题,需要替换查询语句的一部分。现在我有以下内容:

select count(*) FROM "mytable" WHERE "field" IN ('v1', 'v2', ..., 'vN');

这可以翻译成 Django ORM:

Mytable.objects.all().filter(field__in=[myvalues]).count()

不过我需要执行以下操作:

select count(*) FROM "mytable" JOIN (values ('v1', 'v2', ..., 'vN')) as lookup(value) on lookup.value = "mytable".field;

有没有办法将其添加到 ORM 中?我需要处理 ORM,因为我已经有了其他过滤器。最坏的情况我想到了获取查询字符串并手动添加...

我正在使用 Postgresql 9.6

在反复阅读文档后,我找到了一种方法。我什至发现a patch前一段时间没有合并

它并没有真正进行连接,但它比直接使用 __in 快得多。

我正在做的是执行 Django 2.0 中引入的 RawSQL(),结果我再次执行 __in

所以这是一个代码示例:

query = """select myfield from mytable join (values 
             ('v1'), ('v2'), ..., ('vN')
           ) as lookup(value) on lookup.value = mytable.myfield"""
r = RawSQL(query, [])
mymodel.filter(myfield__in=r)

现在只需几毫秒而不是几分钟!