gpt4 book ai didi

python - 如何使用更新合并两个查询的结果

转载 作者:太空宇宙 更新时间:2023-11-04 00:05:33 25 4
gpt4 key购买 nike

我必须显示类别名称和每个类别中的项目数量。项目可以更改类别,所以我将项目的历史记录保存在表中 items_history

要显示我正在运行此查询的所有类别名称:

category_total = Category.objects.all()

结果示例:

<QuerySet [<Category: Drink>, <Category: Food>, <Category: Fun>, <Category: Suplies>]>

要获得每个类别中的项目数量,我必须检查表 items_history :

items_history = Category.objects.filter(items_history__current=1).annotate(qtd=Count("items_history__idea_id"))

结果示例:

<QuerySet [<Category: Food>]> 
items_history[0].name -> 'Food'
items_history[0].qtd -> 5

在这种情况下,我只有食品类别中的项目。所以我不能在 items_history 中只做一个查询,因为我不会获得其他类别中的项目数量(在本例中为 0)。

我需要获取所有类别及其各自的数量,所以如果一个类别没有保存在 items_history 中我应该得到类别 namequantity = 0 .预期结果:

        items_history[0].name -> 'Drink'
items_history[0].qtd -> 0

items_history[1].name -> 'Food'
items_history[1].qtd -> 5

items_history[1].name -> 'Fun'
items_history[1].qtd -> 0

items_history[1].name -> 'Suplies'
items_history[1].qtd -> 0

我正在尝试使用 update合并 category_total 的结果和 items_history像这样:

 category_total.update(items_history);

但它不起作用。我怎样才能做到这一点?如果不可能,您是否有其他想法来合并这些查询的结果?

我的模型:

 class Category(models.Model):
name = models.CharField(max_length=50)
description = models.TextField(max_length=500, blank=True, null=True)
order = models.PositiveSmallIntegerField(default=False)

def __str__(self):
return self.name



class Items_History(models.Model): # noqa
current_phase = models.ForeignKey('Category', on_delete=models.DO_NOTHING)
previous_phase = models.PositiveSmallIntegerField()
date_change = models.DateTimeField('data da mudança')
idea = models.ForeignKey('Idea', on_delete=models.DO_NOTHING)
author = models.ForeignKey('users.UserProfile', on_delete=models.DO_NOTHING)
current = models.BooleanField()

最佳答案

截至 ,我们可以在 Count function [Django-doc] 中使用 filter 参数.

因此,我们可以编写这样的查询:

from django.db.models import Count, Q

Category.objects.annotate(
qtd=Count("items_history__idea_id"<b>, filter=Q(items_history__current=1)</b>)
)

因此,这会将过滤转移到在 COUNT(..) 部分本身完成,例如:

SELECT category.*, 
<b>COUNT(CASE WHEN items_history.current
THEN items_history.idea_id
ELSE NULL END)</b> AS qtd
FROM category
LEFT OUTER JOIN items_history ON category.id = items_history.current_phase_id
GROUP BY category.id

对于相同 Item相同 Category,可以有多个Item_History current 设置为 True,您可能还想向其添加 distinct=True 标志:

from django.db.models import Count, Q

Category.objects.annotate(
qtd=Count(
"items_history__idea_id",
filter=Q(items_history__current=1),
<b>distinct=True</b>
)
)

关于python - 如何使用更新合并两个查询的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54238233/

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