2015-06-03 1 views
2

У меня есть модели:Фильтра QuerySet по реверсу существует проверку в Django

class Post(models.Model): 
    content = models.CharField() 
    user = models.ForeignKey('users.User') 
    active = models.BooleanField(default=True) 

class Comment(models.Model): 
    post = models.ForeignKey(Post, related_name='post_comments') 

И в QuerySet, который фильтруется параметры запроса:

user = request.QUERY_PARAMS.get('user_id', None) 
active = request.QUERY_PARAMS.get('active', None) 
has_comments = request.QUERY_PARAMS.get('has_comments', None) 

qs = Post.objects.all() 

if user: 
    qs = qs.filter(user=user) 
if active: 
    qs = qs.filter(active=active) 
if has_comments: 
    ??? 

Я не понимаю, как я могу отфильтровать этот запрос сохраняя все предыдущие фильтры. Является ли это возможным?

ответ

1

Согласно documentation:

Для обозначения отношения «обратного», просто использовать строчное название модели.

this answer Из него следует ваш код будет:

if user: 
    qs = qs.filter(user=user) 
if active: 
    qs = qs.filter(active=active) 
if has_comments: 
    qs = qs.filter(comment__isnull=False) 

Что касается производительности принять во внимание this answer:

Django не поддерживает метод select_related() для обратного иностранного ключевых запросов, поэтому лучше всего вы можете обойтись без выхода из Python - это два запроса базы данных .

Вы также должны взглянуть на prefetch_related, которые могут, в отличие от select_related делать Lookups по обратной ForeignKeys, хотя и с отдельным запросом для каждого элемента QuerySet.

+1

Спасибо! '' 'qs.filter (post_comments__isnull = False)' '' работал. Немного больше объяснений об этом в документации было бы неплохо. – Mark

+0

Обратите внимание, что моя запись в блоге довольно устарела, prefetch_related не была добавлена, когда я написал это, и она делает в значительной степени то, что я там говорю. –

Смежные вопросы