首页 > 解决方案 > 如何在我的 Django 模型上将值过滤器与某个外键字段的查询集结合起来

问题描述

我的模型中有这个字段:

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

标签: djangodjango-viewswagtail

解决方案


如果没有棘手的解决方案恕我直言,您正在寻找的东西是不可能的。原因是该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'])

现在您picture的值中有一个 qs 作为实例,您可以使用附带的漂亮渲染选项


推荐阅读