我有两个型号; '发布','图像'。 'Post'是'Images'模型中的ForeignKey。
class Post(models.Model):
user= models.ForeignKey(User)
title= models.CharField(max_length=120)
body= models.TextField()
class Images(models.Model):
post= models.ForeignKey(Post, default=None, related_name='images')
image= models.ImageField(upload_to='company', verbose_name= 'Image')
我想过滤属于特定'post_id'的所有'图片'。
我使用prefetch_related()运行了以下查询,但我只获得了与Post相关的数据而没有图像。
mop= Post.objects.filter(id=9).prefect_related('images')
print mop
结束结果
[<Post: man, I'm Back, We are moving to London for summer>]
答案 0 :(得分:1)
如果你只想要一个帖子的图片,但不需要帖子,那么你应该直接获取图片。
images = Images.objects.filter(post=9)
如果您也想要帖子,那么您可以这样做:
post = Post.objects.filter(id=9) # this query isn't needed if you only need the images
images = post.images.all()
这会导致两个查询,一个用于获取帖子,另一个用于获取图像。
如果需要,可以使用prefetch_related
post = Post.objects.filter(id=9).prefetch_related().get()
images = post.images.all()
然而,这仍然需要两个查询,因此没有prefetch_related
的代码效率更高。
prefetch_related
的优势在于您想要获取查询集中所有帖子的图像。例如:
posts = Post.objects.prefetch_related('images')
for post in posts:
# this won't cause any additional queries,
# because you have already prefetched them
images = post.images.all()
例如,如果posts
查询集包含10个项目,那么prefetch_related
将减少11个查询的数量(一个用于帖子,10个用于逐个获取每个帖子的图像)两个(一个用于帖子,一个用于一次获取所有图像)。
答案 1 :(得分:0)
你应该这样做:
images_related_to_mop = mop.images.all()
将通过查询获取已经预取的相关图像。