【问题标题】:How to use percentage sign in annotate key如何在注释键中使用百分比符号
【发布时间】:2021-02-26 07:46:16
【问题描述】:

我正在尝试使用包含百分号的字符串来注释结果列名称。这是基本上可以在任何模型上运行的简化代码:

from django.db.models import F

annotates = {'TEST %': F('id')}
SomeModel.objects.annotate(**annotates)[:1]

这会产生错误IndexError: tuple index out of range,所以我假设 Django 正在尝试对该字符串进行一些格式化,我尝试使用双百分号 'TEST %%' 对其进行转义,这不会引发错误,但它会返回双空格作为列名不是我需要的。

Django 2.2 和 3.1 的结果相同

这是 Django 错误还是我在这里遗漏了一些已知的转义序列?

【问题讨论】:

  • 请不要。您甚至将如何访问注释?只需在模板中以百分比渲染即可。
  • 我建议不要在列名中使用空格或百分号。这不仅会导致查询失败,而且还会使稍后在处理过程中难以访问属性。
  • 它没有在模板中呈现,它是一个用于 excel 的产品统计查询。到目前为止,我在访问列名时对任何字符都没有任何问题,我不明白为什么访问它们会有问题。
  • 那么这仍然不是一个好主意,只需使用一些逻辑呈现列名,而不是使用字典的属性/键。最好只使用有效的 Python 标识符,所以不要使用空格、百分比等。
  • 这不起作用的原因是因为字符串格式适用于 query,但不适用于属性,所以在 query 中它会使用TEST %,但它不会对属性进行相同的字符串插值。

标签: django django-annotate


【解决方案1】:

您不能在Django 中使用%F()Cast() 登录注释。

因为他们在他们的方法中使用了旧的字符串格式(即带有百分号格式的as_sql 方法)并且您的错误来自这些方法中的return template % data, params 行,并且因为您在默认模板它无法呈现它的模板。它与您的 SQL 查询或数据库无关,唯一造成此错误的原因是它们用于格式化字符串的方式。跳过此错误的一种方法是更改​​行

annotates = {'TEST %': F('id')}

annotates = {'TEST %%': F('id')}

它告诉您的Python 的解释器跳过格式中的百分号,但请注意,在您的注释结果中,您将有类似的内容:

{...other fields..., 'TEST %%': some id}

【讨论】:

  • 所以基本上是一个 Django 错误 :)
猜你喜欢
  • 1970-01-01
  • 2022-01-22
  • 1970-01-01
  • 2017-03-05
  • 1970-01-01
  • 1970-01-01
  • 2014-11-25
  • 1970-01-01
  • 2020-03-31
相关资源
最近更新 更多