Django反向查找链接查询集

时间:2014-08-11 05:11:53

标签: django reverse django-queryset

我有几个模型需要进行反向查找,然后以某种方式将查询集链接在一起。

我有3个模型,(1)设计师创建(2)项目,项目包含(3)上传的图像。

模型

class Designer(models.Model):
    ... 

class Project(models.Model):
    designer = models.ForeignKey('Designer')

class UploadedImage(models.Model):
    project = models.ForeignKey('Project')

因此,设计师打开他的页面并希望看到他的所有项目和与他的项目相关的一些图像,我可以做类似的事情,

d = Designer.objects.get(id=2)
projects = d.project_set.all()

但是随后使用图像,我每次都要多次使用数据库。

images = []
for p in projects:
    images.append(p.uploadedimage_set.all())

现在我们还有另一个问题,即如何连接imagesprojects?我可以通过建立像这样的词典来做一些愚蠢的事情,

images = []
for p in projects:
    images.append( { p.id : p.uploadedimage_set.all() } )

然后,当我遍历projects时,我可以使用id来确定哪些图像与哪个项目相关联。

没有更优雅的东西可以让我这么做,

  1. 只打一次数据库
  2. 请允许我做一些看起来像d.projects[0].images[0]的事情。而不是建立某种愚蠢的自定义词典??? Django是否有某种查询集构建工具或其他什么?
  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

如果您只是在与特定设计师关联的图片之后,您可以通过一个查询抓取它们:

designer = Designer.objects.get(id=id)
images = UploadedImage.objects.filter(product__designer=designer)

如果您想将它们与项目联系起来,可以通过以下几种方式实现。

如果没有很多不同的项目,并且您担心过多地查询数据库,可以使用之前的images列表,并在python中执行过滤:

images = list(images) # Crystallise the query
projectImages = [[img for img in images if img.project == p]
                 for p in designer.project_set.all()]

然而,更好的方法是让数据库处理过滤;对于非平凡大小的集合,它可能会更快。

这样,您可以直接查询图像,即:

designer = Designer.objects.get(id=id)
projects = designer.project_set.all() # Project.objects.filter(designer=designer)
projectImages = [UploadedImage.objects.filter(project=p) for p in projects]

第二种方法的最大优点是projectImages中的元素仍然是查询集,因此仍然可以进一步过滤或注释。