如何在我的Django模型上将值过滤器与某个Foreignkey字段的Queryset组合在一起

问题描述 投票:2回答:1

我的模型中有这个字段:

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'],}
django django-views wagtail
1个回答
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作为实例,你可以使用附带的漂亮的渲染选项。

© www.soinside.com 2019 - 2024. All rights reserved.