我想选择每种类型的用户的最新帖子。我的模型是这样的:
class UserPost(models.Model):
POST_CHOICES = (
('image', 'Image'),
('text', 'Text'),
('video', 'Video')
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
post = models.ForeignKey(Post, on_delete=models.CASCADE)
post_type = models.CharField(choices=POST_CHOICES, max_length=10)
posted_at = models.DateTimeField(default=datetime.datetime.now)
我知道可以使用以下查询完成:
UserPost.objects.values('post_type').annotate(date=Max('posted_at'))
但这只返回2列(post_type
,date
(,并且我想要2列以上。
我通过以下查询在MySQL中实现了这一点:
SELECT P1.post_type,
P1.post_id,
P1.posted_at
FROM appname_userpost P1,
(SELECT post_type,
Max(posted_at) AS max_posted_at
FROM appname_userpost
GROUP BY post_type) AS P2
WHERE P1.posted_at = P2.max_posted_at
AND P1.post_type = P2.post_type
AND user_id = 97;
如何使用Django实现这些相同的结果?
您可以在values
中添加您需要的任何列,如下所示:
UserPost.objects.values('post_type', 'post_id', 'posted_at').annotate(date=Max('posted_at'))