Prefetch_Related模型反向查找

时间:2016-05-24 14:54:01

标签: python django django-models

我有两个型号; '发布','图像'。 '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>]

2 个答案:

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

将通过查询获取已经预取的相关图像。