gpt4 book ai didi

python - 在 Django 中加入两个查询集

转载 作者:太空宇宙 更新时间:2023-11-03 13:36:23 25 4
gpt4 key购买 nike

假设我有以下模型

class Award(models.Model):
user = models.ForeignKey(User)


class AwardReceived(models.Model):
award = models.ForeignKey(award)
date = models.DateField()
units = models.IntegerField()


class AwardUsed(models.Model):
award = models.ForeignKey(award)
date = models.DateField()
units = models.IntegerField()

现在,假设我想获得所有用户的奖励数量和所有用户使用的奖励数量(即包含两者的查询集)。我更喜欢为每个计算执行一个查询 - 当我将它组合到我的代码中时,我得到了一些意想不到的结果。此外,对于我的一些查询,不可能通过一个查询来完成,因为查询会变得太复杂——我正在计算 8 个字段。到目前为止,这就是我解决它的方法:

def get_summary(query_date)
summary = (Award.objects.filter(awardreceived__date__lte=query_date))
.annotate(awarded=Sum('awardissuedactivity__units_awarded')))

awards_used = (Award.objects.filter(awardused__date__lte=query_date)
.annotate(used=Sum('awardused__date__lte__units')))

award_used_dict = {}
for award in awards_used:
award_used_dict[award] = award.used

for award in summary:
award.used = award_used_dict.get(award, 0)

return summary

我敢肯定,一定有一种不用字典方法就能解决这个问题的方法吗?例如,类似这样的内容:awards_used.get(award=award),但这会导致每个循环都进行数据库查找。

或者其他加入查询集的奇特方式?

请注意,这是一个简化的示例,我知道对于这个示例,数据库结构可以改进,我只是想说明我的问题。

最佳答案

解决方案 1

只需尝试使用 | 连接您的查询集

final_q = q1 | q2

在你的例子中

final_q = summary | awards_used

更新:

|使用计算属性不起作用,所以,我们可以先选择我们的查询集,然后映射我们的额外属性

summary = Award.objects.filter(awardreceived__date__lte=query_date) 
awards_used = Award.objects.filter(awardused__date__lte=query_date)
final_q = summary | awards_used

final_q = final_q.annotate(used=Sum('awardused__date__lte__units')).annotate(awarded=Sum('awardissuedactivity__units_awarded'))

解决方案 2

使用链内置函数

from itertools import chain
final_list = list(chain(summary, awards_used))

这种方法有一个问题,你不会得到一个查询集,你会得到一个包含实例的列表。

关于python - 在 Django 中加入两个查询集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38967599/

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