Django 组由注释 Min

Django group by annotate Min

我有两个模型:

models.py

class Representation(models.Model):
    datetime = models.DateTimeField()
    show = models.ForeignKey(Show)

class Show(models.Model):
    name = models.CharField(max_length=512)

然后我想要接下来的 5 个即将到来的节目,我能做的最好的就是像那样聪明的 hack,但这只会使用大量的查询,我相信还有更多pythonic 的方式来做到这一点

i=5
list_shows = set()
while (len(list_shows) < 5:
    for rep in Representation.objects.filter(datetime__gt=datetime.now()).order_by('-datetime')[:i]:
        list_shows.add(rep.show)
    i+=1
    if i>100:
        break

我也试过这样的方法:

from datetime import datetime
from django.db.models import Min
Show.objects.annotate(date=Min('representation__datetime')).filter(date__gte=datetime.now()).order_by('date')[:5]

但这不包括昨天已经播放但今晚要播放的节目。

你能试试这个吗:

Show.objects.filter(representation_set__datetime__gt=datetime.now()).order_by('representation_set__datetime')[:5]