gpt4 book ai didi

django - 依靠 Django 查询集中的多个字段

转载 作者:行者123 更新时间:2023-12-04 02:01:19 25 4
gpt4 key购买 nike

我有一个代表两个用户之间交易的模型,如下所示:

class Transaction(models.Model):
buyer = models.ForeignKey(
Person, on_delete=models.SET_NULL, null=True, related_name="bought"
)
seller = models.ForeignKey(
Person, on_delete=models.SET_NULL, null=True, related_name="sold"
)
product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)

我想获得每个用户(作为买家或卖家)的交易数量。如果我只想依靠一个领域,我可以这样做:
Transaction.objects.values('seller').annotate(Count('seller'))

但我无法在 1 个查询中同时在两个字段上执行此操作。
有没有办法做到这一点 ?

谢谢

最佳答案

我刚刚从自己那里遇到了这个问题,所以我会发布一个答案,以防有人需要它:
明显的想法是使用两个 Count在单个注释中,但作为 django doc says , 在 annotate 中使用多个聚合会产生错误的结果。它确实适用于 Count , 使用 distinct关键字,对于 Django 2.2 或 3:

from django.db.models import Count
result = Person.objects.annotate(
transaction_count=Count("bought", distinct=True) + Count("sold", distinct=True)
).values("id", "transaction_count")
对于 Django < 2.2,您可以使用子查询:
from django.db.models import Count, OuterRef, F

buyer_subquery = (
Transaction.objects.filter(buyer_id=OuterRef("id"))
.values("buyer_id")
.annotate(subcount=Count("id"))
.values("subcount")
)
seller_subquery = (
Transaction.objects.filter(seller_id=OuterRef("id"))
.values("seller_id")
.annotate(subcount=Count("id"))
.values("subcount")
)
Person.objects.annotate(
buyer_count=buyer_subquery,
seller_count=seller_subquery,
transaction_count=F("buyer_count") + F("seller_count"),
).values("id", "transaction_count")

关于django - 依靠 Django 查询集中的多个字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47135963/

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