сложный запрос внешнего ключа django - PullRequest
0 голосов
/ 05 августа 2011

Я знаю, что это глупо, но ...

У меня есть два класса моделей

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 ]

2 голосов
/ 05 августа 2011

Для # 1: для каждого изображения есть только одна галерея. Если у вас есть объект изображения img, то галерея для него будет

gallery = img.gallery

Для # 2: Чтобы получить все изображения для галереи:

imgs = gallery.image_set.all()
1 голос
/ 05 августа 2011

Мне кажется, я понимаю, что вы ищете.

Запрос # 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

Query # 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 %}    
1 голос
/ 05 августа 2011

Для # 2:

Если g - галерея, тогда используйте:

g.image_set.all()
...