Каков наилучший способ цепочки и фильтрации запросов к БД в Django? - PullRequest
1 голос
/ 29 августа 2011
# 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? В моем примере мне нужно было бы запустить запрос в цикле. (чего я сейчас не делаю в коде)

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))

Есть ли лучший способ, чем этот, для моих нужд?

Ответы [ 2 ]

2 голосов
/ 29 августа 2011

Django Querysets ленивы, поэтому они не оценивают, пока вы не попытаетесь получить доступ к результатам. Вы можете цепочки фильтров, как вы сделали, или положить их все в один. Я думаю, это действительно зависит от того, есть ли у вас вся информация при запуске или вам нужно динамически добавлять фильтры на основе чего-либо. В любом случае, конечный результат запроса будет одинаковым. Ознакомьтесь с документацией Джанго по теме

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

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

для вашей второй части. Я думаю, что вы просто хотите простой фильтр «__in», который даст вам все сообщения, пользователь которых находится в друзьях. ( документы Джанго )

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

Django по умолчанию позволит вам иметь «друзей» как сам набор запросов и выполнит подзапрос, когда он получит результаты. Если вы не хотите выполнять подзапрос, вы можете отправить своих друзей в список, и он будет запрашивать друзей, а затем запрашивать сообщения.

friends_posts = Post.objects.filter(privacy=False, user__in=list(friends))
0 голосов
/ 29 августа 2011

Я думаю, вы можете искать фильтр '__ in' - то есть:

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))
...