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

问题描述

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

{ '1': 2,'2': 2,'4': 2,'5': 2,'-2': 2,'-1': 1 
}

这会产生错误 from django.db.models import F annotates = {'TEST %': F('id')} SomeModel.objects.annotate(**annotates)[:1] 所以我假设 Django 正在尝试对该字符串进行一些格式化,我尝试使用双百分号 IndexError: tuple index out of range 来转义它,这不会引发错误但它返回双空格作为列名,这不是我需要的。

Django 2.2 和 3.1 中的结果相同

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

解决方法

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

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

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

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

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

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