gpt4 book ai didi

django - django __in 查找查询集的效率

转载 作者:行者123 更新时间:2023-12-04 04:38:12 24 4
gpt4 key购买 nike

我在 Django 中设置了一个复杂的数据库模型,我必须根据过滤器数据进行一些计算。我有一个 Test对象,一个 TestAttempt对象,和一个 UserProfile对象(带有返回测试的外键和返回用户配置文件的外键)。我在 TestAttempt 上运行了一个方法计算测试分数(基于与每个测试相关的正确答案相比的多个用户提供的选择)。然后我在 Test 上运行的另一种方法根据每个相关的 TestAttempt 计算平均测试分数's 但有时我只想要基于提供的相关子集的平均值 TestAttempt与一组特定的 UserProfiles 链接的 's .因此,不要以这种方式计算特定测试的平均测试分数:

[x.score() for x in self.test_attempts.all()]

然后平均这些值。
我做这样的查询:
[x.score() for x in self.test_attempts.filter(profile__id__in=user_id_list).all()]

哪里 user_id_list是 UserProfile id 的一个特定子集,我想以列表的形式找到平均测试分数。我的问题是:如果 user_id_list确实是全套 UserProfile 's(因此过滤器将返回与 self.test_attempts.all() 相同的结果)并且大多数情况下都是这种情况,检查这种情况是否值得,如果是这样,根本不执行过滤器?或者 __in 查找是否足够有效,即使 user_id_list包含所有用户,运行过滤器会更有效率。另外,我是否需要担心使结果 test_attempts 不同()?或者他们不可能用我的查询集的结构找到重复项?

编辑:对于任何有兴趣查看原始 SQL 查询的人,它看起来像这样没有过滤器:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date", 
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" WHERE "mc_grades_testattempt"."test_id" = 1

这与过滤器:
SELECT "mc_grades_testattempt"."id", "mc_grades_testattempt"."date", 
"mc_grades_testattempt"."test_id", "mc_grades_testattempt"."student_id" FROM
"mc_grades_testattempt" INNER JOIN "mc_grades_userprofile" ON
("mc_grades_testattempt"."student_id" = "mc_grades_userprofile"."id") WHERE
("mc_grades_testattempt"."test_id" = 1 AND "mc_grades_userprofile"."user_id" IN (1, 2, 3))

请注意,数组 (1,2,3) 只是一个示例

最佳答案

根据我对文档的理解,所有查询都是在实际使用之前构建的。因此,例如,test_attempts.all()生成 SQL 代码一次,当您执行查询时,实际上通过执行类似 .count() 的操作来获取数据。 , for t in test_attempts.all():等,它在数据库上运行查询并返回一个 Queryset 对象,或者如果你使用了 get() 则只返回一个对象。考虑到这一点,对数据库的调用次数将完全相同,而实际调用会有所不同。正如您在编辑后的帖子中所示,原始查询是不同的,但它们都是在 Django 访问数据之前以相同的方式生成的。从 Django 的角度来看,它们都将以相同的方式创建,然后在数据库上执行。在我看来,最好不要测试 all() 情况,因为您必须运行两个查询来确定。我相信您应该使用您拥有的代码运行并跳过检查 all() 场景,您将其描述为最常见的情况。大多数现代数据库引擎以这样一种方式运行查询,即添加的连接不会妨碍性能指标,因为它们无论如何都以最佳顺序处理查询。

关于django - django __in 查找查询集的效率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8828880/

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