如何在Django QuerySets中缩小结果范围?

时间:2014-07-17 09:34:43

标签: python mysql django django-queryset

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

|---------------------------------------|
|                                       |
|   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来解决这类问题?

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

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