gpt4 book ai didi

Django orm 子查询 - 在没有替换的子句中

转载 作者:行者123 更新时间:2023-12-01 22:52:21 32 4
gpt4 key购买 nike

我需要使用 Django ORM 构建一个查询,在 SQL 中看起来像这样:

select * from A where id not in (select a_id from B where ... )

我尝试使用这样的代码:

ids = B.objects.filter(...)
a_objects = A.object.exclude(id__in=Subquery(ids.values('a__id'))).all()

问题是 Django 生成的查询不是嵌套的选择,而是看起来像

select * from A where id not in (1, 2, 3, 4, 5 ....)

where in 子句明确列出了所有应该排除的 id,使得结果 sql 在打印到日志中时不可读。是否可以调整此查询,以便使用嵌套选择?

最佳答案

所以我看到您的目标是从 B 中获取所有没有外键关系的 A。如果我是对的,那么您只需使用反向查找即可。

因此,当您这样定义模型时:

class A:
pass

class B:
a = ForeignKey(to=a, related_name='bs')

你可以像这样过滤它:

A.objects.filter(bs__isnull=True)

此外,如果您不定义related_name,它将默认为b_set,因此您将能够A.objects.filter(b_set__isnull=真)

关于Django orm 子查询 - 在没有替换的子句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74085862/

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