2015-12-28 2 views
1

У меня есть следующий запрос:Джанго фильтр на предвыборке

prefetch = Prefetch('books', queryset=Book.objects.filter(is_published=True), 
          to_attr='published_books') 

profiles = Profile.objects.prefetch_related(prefetch) 

Это выбирает все профили и заполнит их с опубликованными книгами. Тем не менее, я хочу только профили, которые фактически опубликовали книги (другими словами len(profile.published_books) > 0).

Как я могу достичь этого в Орме?

UPDATE:

class Book(Model): 
    profile = ForeignKey(Profile, related_name="books", related_query_name="book") 
    name = CharField(max_length=250) 
    is_published = BooleanField(default=True) 

    class Meta: 
     unique_together = (('profile', 'name'),) 
+0

Не могли бы вы добавить соответствующую модель, пожалуйста? –

+0

Готово. Пожалуйста, просмотрите обновление. –

ответ

0
profile_ids = Profile.objects.filter(book__is_published=True).values_list("pk", flat=True).distinct() 
profiles = Profile.objects.filter(pk__in=profile_ids).prefetch_related(prefetch) 

это приведет к подзапрос, локализовать правильные идентификаторы профиля, а затем возвращать любой профиль, которые соответствуют одному из этих идентификаторов. Использование функции distinct не влияет на результат, но я предполагаю, что это может улучшить производительность (не совсем уверен)

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