Найти - Пользователи
Полная версия: запрос с использованием нескольких ForeignKey
Начало » Django » запрос с использованием нескольких ForeignKey
1
Dr.Livsi
есть несколько моделей:
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, например…
strannik747
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
Ferroman
albums=PhotoAlbum.objects.filter(section_name=7)
photos=Photo.objects.filter(album_name__in=albums)
Не проверял.
H1D
То ли я чёт не понял, то-ли вы действительно изобретатели.
Photo.objects.filter(album_name__section_name__pk=2)
Dr.Livsi
Всем спасибо за предложенные варианты. Буду пробовать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB