我在Django中有一个image字段,但是我使用的是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
访问它)。知道如何访问此变体吗?
答案 0 :(得分:0)
我相信您可以在这种情况下避免子查询并保持简单。
#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}
现在,您可以将其作为上下文发送,并使用article.img.thumbnail.url
或article.thumbnail_url
答案 1 :(得分:0)
每篇文章中有很多照片对象吗?如果不是,最好的方法是使用prefetch_related预取所有照片(使用Prefetch对象对其进行排序),然后使用简单索引获取第一个
list(article.photos.all())[0]
请注意,无论哪种方式,Django都将决定使用list()进行其他查询,而不要使用已经预取的对象。您可以向Article(latest_photo)添加方法来执行此操作,并在视图中调用prefetch_related,然后在模板中使用该方法。