【问题标题】:Add function when getting queryset django获取queryset django时添加功能
【发布时间】:2020-12-12 09:00:19
【问题描述】:

在我看来,我通过这个变量获得了热门文章:

popular_article_list = Article.objects.order_by('-votes')[:5]

现在在我的模型中,我有一个如下所示的 was_published_recently 函数:

def was_published_recently(self):
        now = timezone.now()
        return now - datetime.timedelta(days=1) <= self.pub_date <= now

那么如何结合这两者来获得最近 24 小时内最热门的文章呢?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    查询集无法访问函数,因为QuerySet 在数据库端生成查询。数据库对这些函数一无所知。这也是非常低效的,因为这意味着首先获取所有对象,然后在 Django/Python 级别进行过滤。

    但是,您可以使用昨天和今天之间具有pub_date 的对象过滤QuerySet

    from django.db.models.functions import Now
    from datetime import timedelta
    
    popular_article_list = Article.objects.filter(
        pub_date__range=(Now()-timedelta(days=1), Now())
    ).order_by('-votes')[:5]

    您可以通过在pub_date 字段上添加数据库索引来进一步提高效率:

    class MyModel(models.Model):
        # …
        pub_date = models.DateTimeField(auto_now_add=True, db_index=True)

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2019-06-22
      • 1970-01-01
      • 2011-04-06
      • 2014-10-08
      • 2011-04-14
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多