Как получить доступ к специальному полю в подзапросе? - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть поле изображения в Django, но я использую поле StdImage :

class Photo(TimestampedModel):
    image = StdImageField(upload_to='photos', variations={'thumbnail': (200, 200), 'large': (1024, 1024)})

Обычно в шаблоне я могу использовать следующее для доступа к 'варианту':

<img alt="" src="{{ object.myimage.thumbnail.url }}"/>

Однако я использую подзапрос для получения последней фотографии для статьи (может быть много фотографий или их нет), и у меня нет другого способа, кроме как извлечь изображение как единое целоезначение (поскольку я не могу получить несколько значений в подзапросе).

newest_photo = Photo.objects.filter(industry__type=OuterRef('pk')).order_by('-date')
list = Article.objects.filter(published=True).annotate(image=Subquery(newest_photo.values('image')[:1]))

Все это хорошо работает.За исключением одного.Я могу получить только обычное изображение, а не вариант (к которому я обычно обращаюсь по object.image.thumbnail.url).Есть идеи, как получить доступ к этому варианту?

Ответы [ 2 ]

0 голосов
/ 10 февраля 2019

Много ли у вас фото объектов в статье?Если нет, лучше всего использовать prefetch_related для предварительной выборки всех фотографий (упорядочить их с помощью объекта предварительной выборки), а затем получить первое с простым индексом

list(article.photos.all())[0]

Обратите внимание, что вы должны использовать list (), либоТаким образом, Django решит сделать другой запрос, вместо того, чтобы использовать уже предварительно выбранные объекты.Вы можете добавить метод в Article (latest_photo), чтобы сделать это, и вызвать prefetch_related в представлении, а затем использовать метод в шаблоне.

0 голосов
/ 09 февраля 2019

Я полагаю, что вы можете избежать подзапросов в этой ситуации и сохранить их простыми.

#view.py

newest_photo = Photo.objects.filter(industry__type=OuterRef('pk')).order_by('-date')[:1]
articles = Article.objects.filter(published=True)
article_list = []

for article in list:
  article_list.append({
    #here you add the article fields you want from the model
    #or 'article':article.to_dict()
    'img':newest_photo,
    #just to be sure add the url here as well
    'thumbnail_url':newest_photo.thumbnail.url
  })
context = {'articles':article_list}

Теперь вы можете отправить его как контекст и получить доступ к URL с помощью article.img.thumbnail.url или article.thumbnail_url

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...