我的模型中有这个字段:
class PlayerDetailPage(Page):
picture = models.ForeignKey('wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+', help_text=_('Player profile picture.'))
我想创建一个包含标记,我在这个Wagtail页面模型上访问不同的字段。对于db效率我使用值,但在picture
字段我想要完整的查询集。不只是字典中的值,因为我需要渲染图像。
现在我有这个观点:
PlayerDetailPage.objects.values('title', 'path' , 'slug', 'owner__age', 'owner__nationality', )
到目前为止这么好,我只拉动我需要的字段,我得到一个很好的字典与一个查询。但是对于picture
字段,我想要完整的查询集,因为它是Wagtail图片字段。它附带了一些很好的渲染选项。如何在我的视图中结合使用以获得最佳的数据库高效查询?
不幸的是,直接网址不是图像模型中的一个字段,我想它是一个属性,我尝试了picture__url
,但解决了:
Cannot resolve keyword 'url' into field. Choices are: collection, collection_id, created_at, file, file_hash, file_size, focal_point_height, focal_point_width, focal_point_x, focal_point_y, height, id, renditions, tagged_items, tags, title, uploaded_by_user, uploaded_by_user_id, width
我的看法:
@register.inclusion_tag('wdashboard/tags/player_widget.html', takes_context=True)
def player_widget(context):
qs = PlayerDetailPage.objects.values('title', 'path' , 'picture__file', 'slug', 'owner__age', 'owner__nationality', )
for ins in qs:
ins['picture'] = Image(file=ins['picture__file'])
return {'values1': qs,'request': context['request'],}
没有棘手的解决方案恕我直言,你正在寻找的东西是不可能的。原因是values
方法在db上只运行一次非常明确的查询,然后将结果转换为dict
。所以你永远不会得到原始的PlayerDetailPage
对象而是一个字典。例如,如果你有一个型号MyModel
并且你做了以下
x = MyModel.objects.get(id=1)
print(type(x)) # <class 'MyModel'>
但对于价值观,情况就不同了
x = MyModel.objects.values('id').get(id=1)
print(type(x)) # <class 'dict'>
所以你失去原始对象并得到一个字典。
一个聪明的解决方案
如果您没有其他选择,那么使用values
,我会建议以下解决方案。
构建您的查询,并从Image
模型获取所需的数据。
qs = PlayerDetailPage.objects.values('picture__name') # assume there is a name field.
现在遍历qs
,初始化一个Image
对象,(不要保存它)并将它添加到你的字典中,就像这样
from wagtail.images.models import Image
for ins in qs:
ins['picture'] = Image(name=ins['picture__name'])
现在你的值qs中有一个picture
作为实例,你可以使用附带的漂亮的渲染选项。