假设我有两个这样的模型:
from django.contrib.auth import User
class Post(models.Model):
text = models.TextField()
class Like(models.Model):
post = models.ForeignKey(Post)
user = models.ForeignKey(User)
我想相当标准。用户可以喜欢的帖子表。
我想获取所有 Post 对象的查询集,并用当前用户的信息进行注释(认为request.user
)是否喜欢它们。
像这样的东西(这当然是不正确的)
qs = Post.objects.all().annotate(like__user=request.user)
我想迭代 qs 并有一个属性表示当前用户是否喜欢该帖子,如下所示:
for post in qs:
if post.current_user_liked:
# do something
我想使用 annotate 的原因当然是性能,我想避免对每个帖子进行查询以检查是否存在 user=request.user 的 Like 。
我想你可以使用annotate()
with RawSQL https://docs.djangoproject.com/en/1.8/ref/models/expressions/#raw-sql-expressions为了这。
如果这不起作用,您可以使用prefetch_related https://docs.djangoproject.com/en/1.8/ref/models/querysets/#prefetch-related with a Prefetch
对象,以便 Django 通过一个额外的查询加载所有相关的 Like。
Post.objects.all().prefetch_related(
Prefetch('current_user_likes', queryset=Like.objects.filter(user=request.user))
)
然后,当您循环查询集时,您将执行以下操作:
for post in qs:
if post.current_user_likes.all():
# do something
请注意,您正在使用all()
在这里,因为结果已经被获取。通常情况下exists()
如果不需要结果会更有效,但这里会导致额外的查询。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)