我有以下查询:
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'),)
答案 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
函数对结果没有影响,但我猜它可以提高性能(不太确定)