Django 如何在注释键中使用百分比符号

Django 如何在注释键中使用百分比符号,django,django-annotate,Django,Django Annotate,我试图用包含百分号的字符串对结果列名进行注释。这是简化的代码,基本上可以在任何模型上运行: from django.db.models import F annotates = {'TEST %': F('id')} SomeModel.objects.annotate(**annotates)[:1] 这会产生错误索引器错误:元组索引超出范围,因此我假设Django正在尝试对该字符串进行格式化,并尝试使用双百分号'TEST%%'对其进行转义,这不会引发错误,但它会返回双空格作为列名,这不是

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

from django.db.models import F

annotates = {'TEST %': F('id')}
SomeModel.objects.annotate(**annotates)[:1]
这会产生错误
索引器错误:元组索引超出范围
,因此我假设Django正在尝试对该字符串进行格式化,并尝试使用双百分号
'TEST%%'
对其进行转义,这不会引发错误,但它会返回双空格作为列名,这不是我需要的

Django 2.2和3.1中的结果相同

这是Django bug还是我缺少了一些已知的转义序列?

您不能在
Django
中使用
%%
F()
Cast()
一起登录批注

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

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

这会告诉您的
Python
解释器跳过百分比符号格式,但请注意,在您的注释结果中,您将有如下内容:

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

请不要。您将如何访问注释?只需在模板中用百分比表示即可。我建议不要在列名中使用空格或百分号。这不仅会导致查询失败,还会使以后在过程中很难访问该属性。它不是在模板中呈现的,它是一个产品统计查询,会转到excel。到目前为止,我在访问列名时对任何字符都没有任何问题,我不明白为什么访问列名时会出现问题。不过,这仍然不是一个好主意,只是用一些逻辑呈现列名,而不是使用字典的属性/键。最好只使用有效的Python标识符,因此不使用空格、百分比等。这不起作用的原因是字符串格式应用于查询,而不是属性,因此在查询中它将使用
TEST%
,但不会对属性执行相同的字符串插值。因此基本上是Django错误:)
{...other fields..., 'TEST %%': some id}