【发布时间】:2014-03-10 12:25:19
【问题描述】:
我想知道我是否可以在单个查询中获得某个模型的所有对象,其日期年份等于模型的 Max('date') 年份。例如,使用Aggregation Django Docs中的模型,如何获得最近发布的Book当年发布的所有Books?
文档中的所有示例均按立即值 (pubdate__year=2006) 进行过滤,但我需要在同一查询中对同一对象使用计算值。
当然,我可以通过执行两个查询来做到这一点:一个用于获取最大年份,第二个用于过滤该年份,但我认为应该可以在单个查询中完成。只是我还没弄明白。
感谢您的帮助!
编辑:
由于你们中的一些人给出了类似的答案,我正在写这个更新,以便更好地理解我的问题。
这是我的模型:
class Expo(models.Model):
class Meta:
verbose_name= _('Expo')
verbose_name_plural = _('Expos')
name = models.CharField(max_length=255)
place = models.CharField(max_length=255, null=True, blank=True)
date = models.DateField()
bio = models.ForeignKey(Bio, related_name='expos')
我需要“我的数据库中存储的Expos 列表中最近一年发生的所有Expos”
为了解决这个问题,我正在这样做:
from django.db.models import Max
max_year = Expo.objects.all().aggregate(Max('date'))['date__max'].year
expos = Expo.objects.filter(date__year=max_year)
但是,据我所知,它对数据库执行了两个查询。我想要一个让我得到相同结果但执行单个查询的表达式。
我已经按照建议尝试了:
Expo.objects.annotate(max_year=Max('date__year')).filter(date__year=F('max_year'))
但得到错误:
FieldError: Join on field 'date' not permitted. Did you misspell 'year' for the lookup type?
我也试过了:
Expo.objects.annotate(max_date=Max('date')).filter(date__year__gte=F('max_date__year'))
但我得到了错误:
FieldError: Cannot resolve keyword 'max_date' into field. Choices are: bio, date, id, items, name, place, max_date
请注意,它表示无法解析'max_date',但它显示在选项中。很奇怪。
再次感谢您的帮助! :)
【问题讨论】:
-
到目前为止你尝试过什么?如果您在查找文档时遇到问题,以下是您正在尝试执行的操作的示例:docs.djangoproject.com/en/dev/topics/db/aggregation/…
-
需要注意的是必须结合
F()表达式使用:docs.djangoproject.com/en/dev/topics/db/queries/… -
谢谢!
F()对象似乎是我需要的,但更大的问题是我需要比较年份,而不是日期。我按照以下答案中的建议进行了尝试:Expo.objects.annotate(max_date=Max('date')).filter(date__gte=F('max_date'))(请注意__gte)但它返回的不是预期的实例(日期在最大日期之前)。我也试过Expo.objects.annotate(max_date=Max('date')).filter(date__year__gte=F('max_date__year')),但得到了这个奇怪的错误:FieldError: Cannot resolve keyword 'max_date' into field. Choices are: bio, date, id, items, name, place, max_date -
在单个查询中执行语句不会提高性能。另外,请记住,而不是
Maxagregation,您可以通过-date获得第一个模型排序。对我来说,两句话更清晰、更易读、更快速地拆分代码。如果您不相信,请尝试用一个与 SQL 品牌无关的句子来编写您的查询。 -
@danihp:你能解释一下为什么它不会提高性能吗?这正是我担心的。谢谢!
标签: sql django django-queryset