我有一张看起来像这样的表:
|---------------------------------------|
| |
| 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来解决这类问题?
注意 :博客和用户模型彼此无关。该表仅用于存档目的。
答案 0 :(得分:1)
您可以从User
对象开始,然后follow the reverse relationship:
User.objects.exclude(blog__date_added__gt=query_date)
<强>更新强>
您更新了问题,指出Blog
和User
模型彼此无关。这通常不是一个好主意,但您可以使用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')