我的模型中有此字段:
class PlayerDetailPage(Page):
picture = models.ForeignKey('wagtailimages.Image', null=True, on_delete=models.SET_NULL, related_name='+', help_text=_('Player profile picture.'))
我想创建一个包含标签,在其中访问此Wagtail页面模型上的不同字段。为了提高数据库效率,我使用值,但在picture
字段上,我需要完整的查询集。不仅仅是字典中的值,因为我需要渲染图像。
现在我有此视图:
PlayerDetailPage.objects.values('title', 'path' , 'slug', 'owner__age', 'owner__nationality', )
到目前为止,我只提取了我需要的字段,并且得到了一个带有一个查询的漂亮字典。但是,对于picture
字段,我需要完整的查询集,因为它是Wagtail图片字段。它附带了一些不错的渲染选项。如何结合我的观点以获得最佳的数据库效率查询?
不幸的是,直接url不是图像模型中的字段,我想它是一个属性,我尝试过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'],}
答案 0 :(得分:2)
没有棘手的解决方案恕我直言,您要寻找的东西是不可能的。原因是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
作为实例,并且可以使用附带的 nice渲染选项。