2011-08-29 29 views
1
# 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) 
  1. 什么是最好的和最佳的方式来做这样的数据库查询?
  2. 另外,如何追加query_set数据类型?在我的例子中,我需要在循环中运行 查询。 (我目前不在代码做)

编辑/ UPDATE:在django中链接和过滤数据库查询的最佳方式是什么?

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,我认为我可以使用“连锁”形式“itertools”添加的4个朋友的查询集。 – amehta

回答

2

Django Querysets很懒,所以在您尝试访问结果之前它们不会评估。您可以像过去那样链接过滤器,也可以将它们合并为一个。我想这实际上取决于你开始时是否拥有所有信息,或者是否需要根据某些内容动态添加过滤器。无论哪种方式,查询的最终结果都是相同的。关于这个问题

friends_posts = Post.objects.filter(privacy=False, user=friends[0]) 

friends_posts = Post.objects.filter(privacy=False).filter(user=friends[0]) 

你的第二个部分退房Django的documentation。我想你只是想要一个简单的'__in'过滤器,它会给你所有的用户在朋友的帖子。 (django's docs

friends_posts = Post.objects.filter(privacy=False, user__in=friends) 

Django的默认会让你有“朋友”是一个QuerySet本身,当它越来越结果将执行的子查询。如果你不想执行一个子查询,你可以强迫你的朋友进入一个列表,然后查询这些朋友,然后查询这些帖子。

friends_posts = Post.objects.filter(privacy=False, user__in=list(friends)) 
+0

感谢您的解释。我已经在原始代码中添加了新的代码。 – amehta

+0

如果我理解正确,我想你想要user__in = friends – Aaron

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)) 
相关问题