django - 如何在我的 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'],}
解决方案
如果没有棘手的解决方案恕我直言,您正在寻找的东西是不可能的。原因是该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 作为实例,您可以使用附带的漂亮渲染选项。
推荐阅读
- vim - Vim - 当缓冲区列表为空时,是否可以显示 Intro 而不是创建 [No Name] 文件?
- kubernetes - 如何将输出细节添加到 Helm 测试的测试输出中?
- jmeter - JMETER 错误 - 需要在环境或系统属性中,或作为小程序参数,或在应用程序资源文件中指定类名
- javascript - 为什么 setInterval 在没有'useEffect'的情况下不能在 React 中工作?
- c# - 如何在我的项目中添加对库的引用?
- javascript - 调用 Gatsby createPage 后如何在 React Component 类中使用上下文
- pyqt5 - 在 Linux 上使用 Conda 安装 PyQt5
- css - flexbox图像/背景中的CSS列链接图像与底部对齐
- javascript - 多个 args.split().join(" ") discord.js
- ios - URP Simple Lit Emission 不适用于构建 iOS