具有'%'符号的字段名称上的Django .values():“ ValueError:索引83处不支持的格式字符'_'(0x5f)”

麦克风

我有一个名为的字段的模型%_Coverage,当我尝试将其传递给.valuesQuerySet时,Django抛出错误,提示“ ValueError:不支持的格式字符'_'(0x5f)”。如何摆脱百分号正确运行的困扰?

My_Message = type('My_Message', (models.Model,), {
    '__module__': __name__,
    'id': models.AutoField(primary_key=True),
    'name': 'My_Message',
    '%_Coverage': models.IntegerField
})

class Message:
    My_Message = models.ForeignKey(My_Message, on_delete=models.CASCADE, null=True, blank=True)

messages = Message.objects.filter(message_name='My_Message').values('My_Message__%_Coverage')
print(messages)  # throws an error

# This works:
messages = Message.objects.filter(message_name='My_Message')
print(messages)
# prints: <QuerySet []>

使用f'My_Message__%_Coverage'会引发相同的错误,并'My_Message__%%_Coverage'抱怨找不到该字段。

这是回溯。

Traceback (most recent call last):
  File "python3.8/site-packages/django/core/handlers/base.py", line 179, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "python3.8/site-packages/django/views/generic/base.py", line 70, in view
    return self.dispatch(request, *args, **kwargs)
  File "python3.8/site-packages/rest_framework/views.py", line 505, in dispatch
    response = self.handle_exception(exc)
  File "python3.8/site-packages/rest_framework/views.py", line 465, in handle_exception
    self.raise_uncaught_exception(exc)
  File "python3.8/site-packages/rest_framework/views.py", line 476, in raise_uncaught_exception
    raise exc
  File "python3.8/site-packages/rest_framework/views.py", line 502, in dispatch
    response = handler(request, *args, **kwargs)
  File "python3.8/site-packages/rest_framework/decorators.py", line 50, in handler
    return func(*args, **kwargs)
  File "views/message_viewer.py", line 220, in my_view
    print(messages)
  File "python3.8/site-packages/django/db/models/query.py", line 263, in __repr__
    data = list(self[:REPR_OUTPUT_SIZE + 1])
  File "python3.8/site-packages/django/db/models/query.py", line 269, in __len__
    self._fetch_all()
  File "python3.8/site-packages/django/db/models/query.py", line 1303, in _fetch_all
    self._result_cache = list(self._iterable_class(self))
  File "python3.8/site-packages/django/db/models/query.py", line 111, in __iter__
    for row in compiler.results_iter(chunked_fetch=self.chunked_fetch, chunk_size=self.chunk_size):
  File "python3.8/site-packages/django/db/models/sql/compiler.py", line 1108, in results_iter
    results = self.execute_sql(MULTI, chunked_fetch=chunked_fetch, chunk_size=chunk_size)
  File "python3.8/site-packages/django/db/models/sql/compiler.py", line 1156, in execute_sql
    cursor.execute(sql, params)
  File "python3.8/site-packages/django/db/backends/utils.py", line 98, in execute
    return super().execute(sql, params)
  File "python3.8/contextlib.py", line 120, in __exit__
    next(self.gen)
  File "python3.8/site-packages/django/db/backends/utils.py", line 113, in debug_sql
    sql = self.db.ops.last_executed_query(self.cursor, sql, params)
  File "python3.8/site-packages/django/db/backends/sqlite3/operations.py", line 160, in last_executed_query
    return sql % params
ValueError: unsupported format character '_' (0x5f) at index 83

这是Django的相关代码:

# django/db/backends/sqlite3/operations.py
def last_executed_query(self, cursor, sql, params):
    # Python substitutes parameters in Modules/_sqlite/cursor.c with:
    # pysqlite_statement_bind_parameters(self->statement, parameters, allow_8bit_chars);
    # Unfortunately there is no way to reach self->statement from Python,
    # so we quote and substitute parameters manually.
    if params:
        if isinstance(params, (list, tuple)):
            params = self._quote_params_for_last_executed_query(params)
        else:
            values = tuple(params.values())
            values = self._quote_params_for_last_executed_query(values)
            params = dict(zip(params, values))
        return sql % params
    # For consistency with SQLiteCursorWrapper.execute(), just return sql
    # when there are no parameters. See #13648 and #17158.
    else:
        return sql
麦克风

我将该字段重命名为Percent_Coverage带有%符号的属性名称似乎是一个糟糕的主意

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

Related 相关文章

热门标签

归档