Django过滤预取

时间:2015-12-28 09:32:16

标签: django django-models

我有以下查询:

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

我怎样才能在orm中实现它?

更新:

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

1 个答案:

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

这将导致子查询找到正确的配置文件ID,然后返回与这些ID之一匹配的任何配置文件。 使用distinct函数对结果没有影响,但我猜它可以提高性能(不太确定)