给定这些模型

class User(Model):
  pass

class Post(Model):
  by = ForeignKey(User)
  posted_on = models.DateTimeField(auto_now=True)


我想获取最新的Post,但不是全部都来自同一个User,我有类似以下内容:

posts = Post.objects.filter(public=True) \
        .order_by('posted_on') \
        .distinct("by")


但是在MySQL上,distinct无效,我想知道是否还有另一种方法?
我已经看到一些使用values()的方法,但是values不适用于我,因为我需要对对象本身做更多的事情

最佳答案

由于distinct在其他字段上无法与MySQL一起使用,因此无法对id进行建模,因此使用Subquery可能是一种解决方法:

from django.db.models import Subquery, OuterRef
...
sub_qs = Post.objects.filter(user_id=OuterRef('id')).order_by('posted_on')
# here you get users with annotated last post
qs = User.objects.annotate(last_post=Subquery(sub_qs[:1]))
# next you can limit the number of users


还要注意,在posted_on字段上的排序取决于您的模型约束-也许您需要将其更改为-posted_on才能从最新的顶部开始进行排序。

关于python - Django Query,在外键上不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59964901/

10-13 09:43