gpt4 book ai didi

django - Django 可以做嵌套查询和排除吗

转载 作者:行者123 更新时间:2023-12-03 21:40:34 27 4
gpt4 key购买 nike

我需要一些帮助在 Django 中整理这个查询。我已经简化了这里的例子,直接切入正题。

MyModel(models.Model):
created = models.DateTimeField()
user = models.ForeignKey(User)
data = models.BooleanField()

我想用英语创建的查询听起来像:

给我昨天创建的所有数据为 False 的记录,在相同范围内,给定用户的数据永远不会显示为 True

这是一个示例输入/输出,以防不清楚。

表值
ID   Created    User    Data

1 1/1/2010 admin False
2 1/1/2010 joe True
3 1/1/2010 admin False
4 1/1/2010 joe False
5 1/2/2010 joe False

输出查询集
1    1/1/2010   admin   False
3 1/1/2010 admin False

我要做的是排除记录#4。这样做的原因是因为在给定的“昨天”范围内,记录 #2 中的用户的数据显示为 True 一次,因此将排除记录 #4。

从某种意义上说,似乎有 2 个查询正在发生。一种用于确定给定范围内的记录,另一种用于排除与“真”记录相交的记录。

如何使用 Django ORM 执行此查询?

最佳答案

您不需要嵌套查询。您可以生成不良用户的 PK 列表,然后在下一个查询中排除包含这些 PK 的记录。

bad = list(set(MyModel.obejcts.filter(data=True).values_list('user', flat=True)))
# list(set(list_object)) will remove duplicates
# not needed but might save the DB some work

rs = MyModel.objects.filter(datequery).exclude(user__pk__in=bad)
# might not need the pk in user__pk__in - try it

你可以把它浓缩成一行,但我认为这和你会得到的一样整洁。 2 查询并不是那么糟糕。

编辑:您可能想阅读有关此的文档:

http://docs.djangoproject.com/en/dev/ref/models/querysets/#in

如果它是这样的,它听起来像是自动嵌套查询(因此只有一个查询在数据库中触发):
bad = MyModel.objects.filter(data=True).values('pk')
rs = MyModel.objects.filter(datequery).exclude(user__pk__in=bad)

但是 MySQL 并没有很好地优化这个,所以我上面的代码(2 个完整的查询)实际上可以运行得更快。

尝试两者并与它们比赛!

关于django - Django 可以做嵌套查询和排除吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2359673/

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