Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Django
  • » запрос с использованием нескольких ForeignKey [RSS Feed]

#1 Март 11, 2011 13:38:52

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

запрос с использованием нескольких ForeignKey

есть несколько моделей:

class Section(models.Model):
...

class PhotoAlbum(models.Model):
section_name=ForeignKey(Section)
...

class Photo(models.Model):
album_name=ForeignKey(PhotoAlbum)
visible=BooleanField
...
Задача: В представлении необходимо получить список всех фото по ID секции.
Как это можно сделать?
на ум приходит только получение списка альбомов в секции, а затем фильтр по модели Photo:
albums=PhotoAlbum.objects.filter(section_name=7)
albums_list=[]
for i in albums: albums_list.append(i.id)

photos=Photo.objects.extra(where=[album_name IN %s, visible=True], params=albums_list)
работоспособность данного кода пока не проверял, но не очень нравится система.
Может быть имеется более элегантное решение? Через select_related, например…



Отредактировано (Март 11, 2011 13:39:46)

Офлайн

#2 Март 11, 2011 14:47:09

strannik747
От:
Зарегистрирован: 2011-02-19
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос с использованием нескольких ForeignKey

Dr.Livsi
Может быть имеется более элегантное решение? Через select_related, например…
Получить одним запросом через Django model API вряд ли получится, т.к. для первых 2-х моделей уже получаем множество (QuerySet) фотоальбомов, и для каждого из них может быть множество фото.
s = Section.objects.get(id=7)
albums = s.photoalbum_set.all()
...
Другой вариант: написать напрямую SQL-запрос с JOIN-ами:
SELECT photo.id, photo.url, photo.visible
FROM section
JOIN photoalbum ON section.id = photoalbum.section_id
JOIN photo ON photo_album.id = photo.album_id
WHERE section.id = 7



Офлайн

#3 Март 11, 2011 14:59:05

Ferroman
От:
Зарегистрирован: 2006-11-16
Сообщения: 2759
Репутация: +  1  -
Профиль   Отправить e-mail  

запрос с использованием нескольких ForeignKey

albums=PhotoAlbum.objects.filter(section_name=7)
photos=Photo.objects.filter(album_name__in=albums)
Не проверял.

Офлайн

#4 Март 12, 2011 13:42:06

H1D
От:
Зарегистрирован: 2011-03-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

запрос с использованием нескольких ForeignKey

То ли я чёт не понял, то-ли вы действительно изобретатели.

Photo.objects.filter(album_name__section_name__pk=2)



Офлайн

#5 Март 12, 2011 19:52:16

Dr.Livsi
От:
Зарегистрирован: 2010-02-15
Сообщения: 192
Репутация: +  3  -
Профиль   Отправить e-mail  

запрос с использованием нескольких ForeignKey

Всем спасибо за предложенные варианты. Буду пробовать.



Офлайн

  • Начало
  • » Django
  • » запрос с использованием нескольких ForeignKey[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version