django外键复杂查询

时间:2011-08-04 20:17:23

标签: django django-views django-1.3

我知道这是愚蠢但是......

我有两个模型类

class Gallery(models.Model):
    name = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published', auto_now_add=True)

    def __unicode__(self):
        return self.name


class Image(models.Model):
    gallery = models.ForeignKey(Gallery)
    image = models.ImageField(upload_to='gallery/%Y/%m/%d')
    caption = models.TextField(blank=True)
    up_date = models.DateTimeField(auto_now_add=True)

    def __unicode__(self):
        return self.caption

我想要三种类型的查询

  1. 使用该图库中的一个“图片”获取所有“图库”
  2. 从单个图库中获取所有图片
  3. 我能处理的第三个从“图像”中获取特定图像

3 个答案:

答案 0 :(得分:2)

对于#1:每张图片只有一个图库。如果你有一个图像对象img,那么它的图库是

gallery = img.gallery

对于#2:获取图库的所有图像:

imgs = gallery.image_set.all()

答案 1 :(得分:1)

对于#2:

如果g是图库,请使用:

g.image_set.all()

答案 2 :(得分:1)

我想我明白你在寻找什么。

查询#1

您想要所有的画廊,以及每个画廊的单个图像。由于Django自动允许您访问相关对象,因此只需检索数据库中的所有库即可实现此目的。

select_related()在执行查询时自动“跟随”外键关系,这意味着以后使用外键关系不需要数据库查询。

#selects all galleries ordered from newest to oldest
galleries = Gallery.objects.order_by('-pub_date').select_related() 

要从模板中的每个图库中获取第一张图片,您可以这样做:

{% for gallery in galleries %}
    {{ gallery.name }}
    <img src="{{ gallery.image_set.all.0.image }}">
{% endfor %}

https://docs.djangoproject.com/en/dev/ref/models/querysets/

https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

查询#2

这实际上与上一个查询完全相同,但仅限于一个图库。

gallery = Gallery.objects.get(id=gallery_id).select_related() 

在你的模板中:

{% for image in gallery.image_set.all %}
    <img src="{{ image.image }}"><br>
    {{ image.caption }}
{% endfor %}