如何将值过滤器与我的Django模型上某个外键字段的查询集组合

时间:2019-04-28 19:28:24

标签: django django-views wagtail

我的模型中有此字段:

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'],}

1 个答案:

答案 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渲染选项