Python 预取相关模型反向查找

Python 预取相关模型反向查找,python,django,django-models,Python,Django,Django Models,我有两个模型张贴“图片”。其中,“Post”是“Images”模型中的外键 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, re

我有两个模型张贴“图片”。其中,“Post”是“Images”模型中的外键

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”的“image”

我使用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>]
[您应该执行以下操作:

images_related_to_mop = mop.images.all()

它将获取查询预先获取的相关图像。

如果您只想获取单个帖子的图像,但不需要帖子,则应直接获取图像

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\u related

post = Post.objects.filter(id=9).prefetch_related().get()
images = post.images.all()
但是,这仍然需要两个查询,因此没有
prefetch\u related
的代码不会更有效

prefetch\u 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
queryset包含10个项目,那么
prefetch\u related
将把查询数量从11个(一个用于post,10个用于分别获取每个post的图像)减少到两个(一个用于post,一个用于一次获取所有图像).

Thaks等待答复。我理解您的第一个查询..本来会这样做,但我不想再点击数据库两次,因为预回迁相关的操作只会点击一次。我之所以说两次,是因为mop=Post.objects.filter(id=9),myphoto=Images.objects.filter(image=mop),对于我的照片中的我:返回我的。这将命中两次。。希望你明白我的意思?如果你使用
预回迁相关的
,你仍然有两个数据库查询-一个用于获取帖子,另一个用于获取相关图像。
预回迁相关的
的优点是如果你有(比如)如果没有
prefetch\u related
,您将有一个查询获取帖子,10个查询获取图像。