【发布时间】:2017-08-01 11:35:01
【问题描述】:
我在 Django 中有一个数据模型,用于保存用户上传的照片。 Photo 模型(ImageField 类型)中有一个名为 image_file 的属性,其中存储了图像的 url。例如,我可以在模板(和视图)中使用 item.image_file.url 成功访问此 url。
但是,我似乎无法在视图中执行以下操作:
Photo.objects.filter(owner=user).order_by('-id').values('id','image_file.url')[:10]
即对于特定用户,我正在尝试获取 10 个最新照片对象的图像 URL 以及对象 ID。这给了我FieldError: Cannot resolve keyword 'image_file.url' into field。这不应该奏效吗?
我知道我可以检索整个对象并在模板中进行过滤,但我觉得只检索我实际需要的字段而不是整个对象更为理想。
附言它是一个 postgresql 后端,并且底层的 Storage 类已被覆盖
【问题讨论】:
-
url是property,而不是数据库中的值 (FileField code),这就是您无法从values()获取它的原因。据我所知,您必须单独获取 url 值... -
这就是我要做的——不过你可能想看看
only()。如果你走那条路,你可能应该用Django Debug Toolbar 之类的东西来观察SQL 查询。如果url属性尝试检索未包含在only()中的字段,它可能会进行单独的SQL 调用。 -
当然——你确定
only()不会给你id吗?我不记得尝试过,但我不明白为什么它无法拉动它。使用only(),您不会失去访问任何内容的能力 - 如果您没有指定它,您只会招致另一个 SQL 命中。 -
@JensAstrup:检查过了。原则上你是对的 .only('id','image_file') 确实给了我属性检索 - 但是根据调试工具栏,我最终做的 SQL 查询比我最初做的多 3 倍(很好地调用分析这)。因此,您推荐的原始方法仍然有效。 p.s.当我早些时候说它不会给我
ids时,我意识到我混淆了only()和latest()。脑子短路了! Anywhoo,感谢您的帮助。直到下次。
标签: django django-views django-orm