簡體   English   中英

如何用 Django ORM 對 QuerySet 的每一項應用注解

[英]How to apply annotation to each item of QuerySet with Django ORM

有很多與此類似的問題,但沒有一個對我有用。

假設我有以下模型:

class Cafe(models.Model):
    name = models.CharField(max_length=150)

    def __str__(self):
        return self.name


class Food(models.Model):
    class SoldStatus(models.TextChoices):
        SOLD_OUT = "SoldOut", "Sold out"
        NOT_SOLD_OUT = "NotSoldOut", "Not sold out"

    name = models.CharField(max_length=50)
    cafe = models.ForeignKey(Cafe, related_name="foods", on_delete=models.CASCADE)
    status = models.CharField(choices=SoldStatus.choices)

    def __str__(self):
        return self.name

在我的 QuerySet 中,我想檢索所有咖啡館,每個咖啡館都有以下字段:“咖啡館名稱”、“食物總數”、“未售出食物總數”和“未售出食物百分比”

有什么辦法可以用Django ORM達到上面的結果嗎?

你可以這樣嘗試:

Cafe.objects.annotate(
    total=Count('foods'), 
    sold=Count('foods', filter=Q(foods__status=Food.SoldStatus.SOLD_OUT)),
    unsold=sold=Count('foods', filter=Q(foods__status=Food.SoldStatus.NOT_SOLD_OUT))
)

可以在文檔中找到更多信息。

我設法通過這個查詢做到了:

from django.db.models import Q, Case, When

ONE_HUNDRED = 100
Cafe.objects.annotate(
    total=Count('food'), 
    unsold=Count('food', filter=Q(food__status=Food.SoldStatus.NOT_SOLD_OUT)),
    percent_of_unsold=Case(
        When(total=0, then=None),
        default=ONE_HUNDRED * Count('food', filter=Q(food__status=Food.SoldStatus.NOT_SOLD_OUT)) / Count('food'),
    )
)

感謝@ruddra 指出了正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM