# A Post Model
class Post(models.Model):
title = model.CharField()
user = models.ForeignKey(User)
privacy = models.BooleanField()
# query all post that have privacy = False, from a set of friends of type User.
# friends = [user1, user2, user5, user9]
def get_friend_posts(request):
# Repeat the statement below for the size of friends. (4 here)
friend_posts = Post.objects.filter(privacy=False).filter(user=fiends[0])
variables = RequestContext(request, {
'friend_posts' : friend_posts
})
return render_to_response('friends_page.html', variables)
EDIT / UPDATE:
posts_query = Posts.objects.filter(privacy=False)
for friend in friends:
q_list.append(bmks_query.filter(user=friend))
for q in q_list:
friend_posts += list(chain(q))
对我的需求有更好的方法吗?
答案 0 :(得分:2)
Django Querysets是懒惰的,因此在您尝试访问结果之前,它们不会进行评估。您可以像过滤那样链接过滤器,也可以将它们全部放在一起。我想这真的取决于你是否在开始时拥有所有信息,或者你是否需要根据某些东西动态添加过滤器。无论哪种方式,查询的最终结果都是相同的。查看关于主题的django的documentation
friends_posts = Post.objects.filter(privacy=False, user=friends[0])
friends_posts = Post.objects.filter(privacy=False).filter(user=friends[0])
第二部分。我想你只想要一个简单的'__in'过滤器,它会给你用户在朋友中的所有帖子。 (django's docs)
friends_posts = Post.objects.filter(privacy=False, user__in=friends)
默认情况下,Django会让'friends'成为一个查询集本身,并在获取结果时执行子查询。如果您不想执行子查询,可以强制您的朋友找到一个列表,它会查询好友,然后查询帖子。
friends_posts = Post.objects.filter(privacy=False, user__in=list(friends))
答案 1 :(得分:0)
我想你可能正在寻找'__in' filter - 即:
def friend_posts(request):
template = 'friends_page.html'
friends = get_friends(request.user) # Gives you [user1, user2, user3] etc
friend_posts = Post.objects.filter(privacy=False, author__in=friends)
context = {'friend_posts': friend_posts}
return render_to_response(template, context, RequestContext(request))