【问题标题】:How to narrow down results in Django QuerySets?如何缩小 Django QuerySets 中的结果?
【发布时间】:2014-07-17 09:34:42
【问题描述】:

我有一个看起来像这样的表:

|---------------------------------------|
|                                       |
|   user-1 | blogpost-2 |  date_added   |
|                                       |
|                                       |
|-------------- two-months -------------|
|                                       |
|   user-1 | blogpost-1 |  date_added   |
|                                       |
|   user-2 | blogpost-1 |  date_added   |
|                                       |
|---------------------------------------|

“两个月”分隔符上方的隔间显示过去两个月内发布的帖子。底部的一个显示超过两个月的帖子。它只是我为解释我的问题而创建的逻辑分离。我想找到自过去两个月以来没有发表任何博客文章的所有用户。因此,理想的结果是 user-2。我试图在 Django 中做这样的事情,但我猜它是错误的。

logs = Blogs.objects.exclude(
        date_added__gt=query_date
    ).values('user_id')

这将被评估为这样的:

SELECT `user_id` FROM `blogs` WHERE NOT (`date_added` > 2014-04-17 08:34:04 )

这本质上不是我想要的,因为它会同时返回 user-1 和 user-2。

我应该如何使用 Django QuerySets 来解决这类问题?

注意:博客和用户模型彼此不相关。该表仅用于存档目的。

【问题讨论】:

  • 您想只获取用户还是该用户的所有博客文章?

标签: python mysql django django-queryset


【解决方案1】:

你可以从User对象开始,然后follow the reverse relationship

User.objects.exclude(blog__date_added__gt=query_date)

更新:

您更新了您的问题,指出BlogUser 模型彼此不相关。这通常不是一个好主意,但您可以使用 annotations 解决此问题:

Blogs.objects.values('user_id').annotate(last_post=Max('date_added')).exclude(last_post__gt=query_date)

注意values('user_id') 部分在这里非常重要,因为它是allows for grouping of all posts made by a given user

【讨论】:

  • 这将无法解决,因为它找不到关键字“博客”。原因是 User 和 Blog 模型之间没有关系。
  • 但是BlogUser模型之间是有关系的,不是吗?
  • 不。不幸的是,没有。
  • 您的意思是Blog模型中有一个用户ID字段,但它没有标记为ForeignKey指向User模型?坦率地说,这很疯狂。如果有 any 方式可以改变这一点,你真的应该这样做。 Django ORM 的整个思想基于模型之间的显式关系。
  • 是的,就是这样,我知道这很疯狂。但它是一个存档表,所以在这种情况下它很好。
【解决方案2】:

尝试按用户分组并标注最早的日期:

Blog.values('user_id'
   ).annotate(oldest=Max('date_added')
   ).exclude(oldest__gt=query_date)
   ).values('user_id')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 2016-09-08
    • 2013-07-15
    • 2020-10-22
    • 1970-01-01
    • 2011-09-04
    • 2011-08-24
    相关资源
    最近更新 更多