Django ORM — объясните на пальцах, как должен выглядеть данный запрос к БД(PostgreSQL)?

Уважаемые Тостеры (c. Battlestar Galactica), медленно, но верно перехожу на "светлую сторону", но на пути к просветлению стоит django-photologue.

Пишу django-приложение (сервис проката автомобилей), для управления изображениями использую django-photologue. Не пойму, как выбрать через присоединенную посредством foreign_key галереи одну фотографию, относящуюся к этой галерее. (Нужно решение средствами Django ORM)

Для прояснения ситуации имеются следующие таблицы :
Моя модель, отвечающая за автомобили :
class Car(models.Model):
    manufacturer = models.ForeignKey(CarManufacturer, verbose_name='Araç markası')
    .......

    gallery = models.ForeignKey(Gallery, verbose_name='Resimler')

    .......
    available = models.BooleanField(verbose_name='Araç mevcut')
    is_rented = models.BooleanField(verbose_name='Araç kiralanabilir mi')
    add_to_main = models.BooleanField(verbose_name='Anasayfaya ekle')
    under_maintance = models.BooleanField(verbose_name='Araç servis dışı mıdır')
    ...........
    ...........


Модели django-photologue к которым идет привязка (из официального релиза)
class Gallery(models.Model):
...........
    photos = SortedManyToManyField('Photo', related_name='galleries', 
                      verbose_name=_('photos'), null=True, blank=True)
...........


class Photo(ImageModel):
    title = models.CharField(_('title'),   max_length=50, unique=True)
    slug = models.SlugField(_('slug'), unique=True)
    ...........
    def get_absolute_url(self):
        return reverse('pl-photo', args=[self.slug])
    ...........


Как видно из связей, у каждого автомобиля (модель Car) имеется своя галерея изображений (модель Gallery), которая в свою очередь имеет Н-ое количество изображений через связь многие-ко-многим (модель Photo).

Внимание, вопрос
Уважаемые знатоки, как должен выглядеть нижеследующий запрос к БД, средствами django-ORM

cursor = connection.cursor()
    cursor.execute ('''SELECT  DISTINCT ON (cars_car)
              cars_car.id AS id,
              cars_carmanufacturer.name AS manufacturer,
              cars_carmodel.name AS model,
              photologue_photo.image AS photo
            FROM
              cars_car,
              photologue_photo,
              photologue_gallery_photos,
              cars_carmanufacturer,
              cars_carmodel
            WHERE
              cars_car.available = True AND
              cars_car.add_to_slider = True AND
              cars_car.under_maintance = False AND
              cars_car.gallery_id = photologue_gallery_photos.gallery_id AND
              cars_car.manufacturer_id = cars_carmanufacturer.id AND
              cars_car.model_id = cars_carmodel.id AND
              photologue_gallery_photos.photo_id = photologue_photo.id''')

    cars = cursor.fetchall()

Решение временное, пока кто-нибудь из уважаемых знатоков не скажет: "Болван, разве так делают? Не кошерно это, в django, писать SQL, да еще так криво, ёпт...", и конечно напишет свой супер-пупер правильный код.

UPD
photologue_gallery_photos = это таблица через которую идет связь многие ко многим(photologue_gallery и photologue_photos)
  • Вопрос задан
  • 3333 просмотра
Пригласить эксперта
Ответы на вопрос 1
Самое простое решение - это добавить в машину поле с четким указанием на одно единственное фото и проставлять его в момент сохранения машины или фото в галерею. А то вы тут на волю случая отдаетесь, выбирая фото, которое подвернется.
Ну, а если в текущей конфигурации – попробуйте prefetch_related - он сделает еще одну выборку в базу, но я не уверен, сработает ли оно на текущей схеме.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы