python - Django - 将子句“WHERE identity IN (SELECT identity ... GROUP BY identity)”翻译成 django orm
问题描述
我有这样的架构:http ://sqlfiddle.com/#!17/88c6a
这是版本控制模型的简单变体,其中单个实体的所有版本都具有相同的identity
. 我必须找到category = 2
他们历史上曾经有过的所有记录。
如何在 Django 中重现这样的查询?(或任何替代查询)
SELECT *
FROM some_table a
WHERE identity IN (SELECT identity
FROM some_table
WHERE category = 2
GROUP BY identity
) AND is_latest = true;
我试图在应用程序中检索这些身份
class SomeTableQueryset(QuerySet):
def had_category_2(self):
with connection.cursor() as cursor:
cursor.execute("""
SELECT identity
FROM some_table
WHERE category = 2
GROUP BY identity;
""")
valid_identities = [i[0] for i in cursor.fetchall()]
并过滤查询集
qs = qs.filter(identity__in=valid_identities)
但这种方法有几个缺点:
- 它不是懒惰的,因此一旦调用 had_category_2 就会执行查询
- 由于明显的原因,它非常慢
那么,我能做些什么呢?
解决方案
我认为这可以帮助你:
qs
.filter(
identity__in=Subquery(
qs
.filter(category=2)
.distinct('identity')
.values('identity')
)
)
推荐阅读
- javascript - 如何使用angular js和node js通过socket.io发送图像、文档和pdf
- python - 使用 cross_val_score 评估多项式回归
- google-cloud-platform - 无法在谷歌云上上传图像 mikrotik-chr
- powershell - 如何在 VSCode 集成终端中运行 Start-Process
- objective-c - 如何在不使用 3rd 方库的情况下压缩/压缩目标 c 中的文件夹
- php - php - 将字符串转换为 uuid 版本 4 格式
- javascript - str.at(index) 在 node.js 终端上不起作用
- r - 无法绑定因子
- javascript - 表单未通过 _POST 发送数据
- android - 使用 xml 在 Android Studio 中使屏幕响应