Django QuerySets - 如何注释一个字段但 return 另一个字段?
Django QuerySets - how to annotate off one field but return a different field?
查看文档中给出的示例:https://docs.djangoproject.com/en/3.0/topics/db/aggregation/
我的问题的相关代码(来自文档):
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Publisher(models.Model):
name = models.CharField(max_length=300)
class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
rating = models.FloatField()
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
pubdate = models.DateField()
class Store(models.Model):
name = models.CharField(max_length=300)
books = models.ManyToManyField(Book)
这些示例展示了我如何在商店中获得一本书的最高价格:
>>> from django.db.models import Max, Min
>>> Store.objects.annotate(max_price=Max('books__price'))
但是,在我的情况下,我想要的是最高价格手册的名称。我该怎么做?我知道我可以有多本最高价的书,但对于我的用例来说,打破平局的标准并不重要。
在我的用例中,我还将 QuerySet 传递给模板,因此我更愿意使用注释框架。
您可以使用 Subquery
expression [Django-doc]:
from django.db.models import OuterRef, <b>Subquery</b>
Store.objects.annotate(
most_expensive_book_name=<b>Subquery(</b>
Book.objects.filter(
<b>store=OuterRef('pk')</b>
).values('name').order_by('-price')[:1]
<b>)</b>
)
查看文档中给出的示例:https://docs.djangoproject.com/en/3.0/topics/db/aggregation/
我的问题的相关代码(来自文档):
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=100)
age = models.IntegerField()
class Publisher(models.Model):
name = models.CharField(max_length=300)
class Book(models.Model):
name = models.CharField(max_length=300)
pages = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
rating = models.FloatField()
authors = models.ManyToManyField(Author)
publisher = models.ForeignKey(Publisher, on_delete=models.CASCADE)
pubdate = models.DateField()
class Store(models.Model):
name = models.CharField(max_length=300)
books = models.ManyToManyField(Book)
这些示例展示了我如何在商店中获得一本书的最高价格:
>>> from django.db.models import Max, Min
>>> Store.objects.annotate(max_price=Max('books__price'))
但是,在我的情况下,我想要的是最高价格手册的名称。我该怎么做?我知道我可以有多本最高价的书,但对于我的用例来说,打破平局的标准并不重要。
在我的用例中,我还将 QuerySet 传递给模板,因此我更愿意使用注释框架。
您可以使用 Subquery
expression [Django-doc]:
from django.db.models import OuterRef, <b>Subquery</b>
Store.objects.annotate(
most_expensive_book_name=<b>Subquery(</b>
Book.objects.filter(
<b>store=OuterRef('pk')</b>
).values('name').order_by('-price')[:1]
<b>)</b>
)