Django,使用最低参数的多对多字段元素的ID注释字段

Posted

技术标签:

【中文标题】Django,使用最低参数的多对多字段元素的ID注释字段【英文标题】:Django, annotate field with id of many-to-many field's element with lowest parameter 【发布时间】:2021-09-28 16:58:46 【问题描述】:

我有以下型号:

from django.db import models

class Topping(models.Model):
    # ...
    price = models.IntegerField()

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

我需要得到以下查询:

my_query = Pizza.objects.all().annotate(
                            topping_with_min_price="get id of topping with the minimal price")

那么,如何获得呢?

【问题讨论】:

topping_with_min_price=Min("toppings__price") 不起作用? @RezaHeydari:这将提供最低的奖品,而不是最低价格的topping 的id @WillemVanOnsem 哼,没错。 【参考方案1】:

您可以使用Subquery

from django.db.models import OuterRef, Subquery

my_query = Pizza.objects.annotate(
    topping_with_min_price=Subquery(
        Topping.objects.filter(
            pizza=OuterRef('pk')
        ).order_by('price').values('pk')[:1]
    )
)

【讨论】:

我同意您的解决方案,但您不必在 Topping 查询中添加 .values("pk") 吗? @Lotram:是的,我忘记了。谢谢!

以上是关于Django,使用最低参数的多对多字段元素的ID注释字段的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO:与附加字段的多对多关系

如何过滤和访问 Django QuerySet 中的多对多字段?

在 django 的多对多关系中添加额外的字段

在 Django 中自动填充一组通用的多对多字段?

具有相同 ID 键字段的多对多

如何在引导选项卡块中按 django 模板中的多对多字段过滤对象