如何访问子查询中的特殊字段?

时间:2019-02-09 12:55:56

标签: python django subquery

我在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访问它)。知道如何访问此变体吗?

2 个答案:

答案 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.urlarticle.thumbnail_url

访问URL。

答案 1 :(得分:0)

每篇文章中有很多照片对象吗?如果不是,最好的方法是使用prefetch_related预取所有照片(使用Prefetch对象对其进行排序),然后使用简单索引获取第一个

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

请注意,无论哪种方式,Django都将决定使用list()进行其他查询,而不要使用已经预取的对象。您可以向Article(latest_photo)添加方法来执行此操作,并在视图中调用prefetch_related,然后在模板中使用该方法。