假设我有这个模型:
class PhotoAlbum(models.Model):
title = models.CharField(max_length=128)
author = models.CharField(max_length=128)
class Photo(models.Model):
album = models.ForeignKey('PhotoAlbum')
format = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
现在,如果我想有效地查看相册子集中的一部分照片.我这样做:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.all()
Run Code Online (Sandbox Code Playgroud)
这只做了两个查询,这是我所期望的(一个是获得专辑,然后是一个像`SELECT*IN photos WHERE photoalbum_id IN().
一切都很棒.
但如果我这样做:
someAlbums = PhotoAlbum.objects.filter(author="Davey Jones").prefetch_related("photo_set")
for a in someAlbums:
somePhotos = a.photo_set.filter(format=1)
Run Code Online (Sandbox Code Playgroud)
然后它做了大量的查询WHERE format = 1!我做错了什么或django不够聪明,意识到它已经取出所有的照片并可以在python中过滤它们?我发誓我在文档中的某个地方读到它本应该这样做......
我正在使用Django 2.2
我有许多与User模型反向相关的模型,我想从具有不同过滤器的每个模型中获取计数。
例如,我有一个Relations像这样的模型
status = (
('Active', 'active')
('Inactive', 'inactive')
)
class Relation(models.Model):
user = models.ForeignKey(User, related_name='relation')
status = models.CharField(choices=status, default=ACTIVE)
Run Code Online (Sandbox Code Playgroud)
现在我想为用户单独获取每个状态的计数和查询集。为此,我在User模型中定义了模型方法
def get_relation():
return self.relation.all()
def get_active_relation(self):
return self.relation().filter(status='active')
def get_inactive_relation():
return self.relation().filter(status='inactive')
def get_active_count():
return self.get_active_relation().count()
def get_inactive_count():
return self.get_inactive_relaiton().count()
Run Code Online (Sandbox Code Playgroud)
我的用户对象为
user = User.objects.prefetch_related(
'relation'
).get(pk=request.user.pk)
Run Code Online (Sandbox Code Playgroud)
现在,当我得到计数时,它会为此执行一个额外的查询
user.get_active_count()
Run Code Online (Sandbox Code Playgroud)
如何过滤对象prefetch_related?
我在另一个 SOF 答案中发现了从 prefetch_latedlambda获取值的用途: /sf/answers/882661811/max
是否也可以用于lambda过滤查询集?