相关疑难解决方法(0)

为什么django的prefetch_related()只能用于all()而不能用于filter()?

假设我有这个模型:

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 orm filter prefetch

81
推荐指数
2
解决办法
6万
查看次数

Django 过滤预取相关查询集

我正在使用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过滤查询集?

django django-models django-queryset

1
推荐指数
1
解决办法
4080
查看次数

标签 统计

django ×2

django-models ×1

django-queryset ×1

filter ×1

orm ×1

prefetch ×1