如何在Django中查询max到min?

时间:2016-08-23 06:59:55

标签: python django

我想查询主题中的最大条目到最小条目。这样:

models.py

class Topic(models.Model):

    title = models.CharField(max_length=140, unique=True, verbose_name=_("Title"))
    created_at = models.DateTimeField(auto_now=True, verbose_name=_("Created at"))

其他型号是:

class Entry(models.Model):

    topic = models.ForeignKey(Topic, verbose_name=_("Topic"))
    content = models.TextField(verbose_name=_("Content"))
    created_at = models.DateTimeField(auto_now=True,verbose_name=_("Created at"))

首先,我想从 Topic.py 中仅过滤今天的条目。那是对的吗? :

def get_topic_today(self):
    return self.filter(date=datetime.date.today()).order_by('title')

而且我想查询热门话题max to min。我认为我们可以使用select_related和从入口到主题模型的反向外键。但我不能这样做。例如,具有最多条目编号的主题必须是第一个并且最低。

3 个答案:

答案 0 :(得分:2)

如果要将DateTimeField过滤到特定日期,可以使用__day lookup

def get_topic_today(self):
    return self.filter(created_at__day=datetime.date.today()).order_by('title')

要获取相关模型的计数,请使用Count annotation,然后对其进行降序排序:

Topic.objects.annotate(entry_count=Count('entry')).order_by('-entry_count')

答案 1 :(得分:1)

如果您想订购从最大条目到最小值的热门话题:

def get_topic_today(self):
    return self.filter(created_at__date=datetime.date.today()).annotate(entry_count=models.Count('entry_set')).order_by('-entry_count')

答案 2 :(得分:0)

最短和最长日期

### please use range for selecting between dates

def get_topic_today(self):
    return self.filter(created_at__range=[min_date, max_date]).order_by('title')

### (or) use greater than or lesser than

def get_topic_today(self):
    return self.filter(created_at__gte=min_date, created_at__lte=max_date).order_by('title')