Django模型related_name格式化字符错误求助
Django迁移错误:ValueError: unsupported format character '_' 解决方法
问题场景
运行python manage.py makemigrations命令时触发如下错误:
ValueError: unsupported format character '_' (0x5f) at index 22
相关模型代码:
class ChangingDocument(PrivateCommentMixin, models.Model): # Список изменяющих документов. treaty = models.ForeignKey("treaties.Treaty", on_delete=models.CASCADE, blank=False, null=False, related_name="%(app_label)s_%(class)s_related", related_query_name="%(app_label)s_%(class)ss", ) changing_document = models.ForeignKey("treaties.Treaty", on_delete=models.CASCADE, blank=False, null=False, related_name="%(app_label)s_%(class)_changing_documents_related", related_query_name="%(app_label)s_%(class)ss_changing_documents", ) def __str__(self): return str(self.changing_document)
错误堆栈信息:
(venv) michael@michael:/media/michael/750/Programming/treaty_outer/treaty_project$ python manage.py makemigrations Traceback (most recent call last): File "manage.py", line 22, in <module> main() File "manage.py", line 18, in main execute_from_command_line(sys.argv) File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line utility.execute() File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 416, in execute django.setup() File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/__init__.py", line 24, in setup apps.populate(settings.INSTALLED_APPS) File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/apps/registry.py", line 116, in populate app_config.import_models() File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/apps/config.py", line 269, in import_models self.models_module = import_module(models_module_name) File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module return _bootstrap._gcd_import(name[level:], package, level) File "<frozen importlib._bootstrap>", line 1014, in _gcd_import File "<frozen importlib._bootstrap>", line 991, in _find_and_load File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked File "<frozen importlib._bootstrap>", line 671, in _load_unlocked File "<frozen importlib._bootstrap_external>", line 848, in exec_module File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed File "/media/michael/750/Programming/treaty_outer/treaty_project/changing_documents/models.py", line 6, in <module> class ChangingDocument(PrivateCommentMixin, File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/db/models/base.py", line 194, in __new__ new_class.add_to_class(obj_name, obj) File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/db/models/base.py", line 371, in add_to_class value.contribute_to_class(cls, name) File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/db/models/fields/related.py", line 866, in contribute_to_class super().contribute_to_class(cls, name, private_only=private_only, **kwargs) File "/media/michael/750/Programming/treaty_outer/venv/lib/python3.8/site-packages/django/db/models/fields/related.py", line 357, in contribute_to_class related_name %= { ValueError: unsupported format character '_' (0x5f) at index 22
错误原因
问题出在changing_document字段的related_name参数中:
related_name="%(app_label)s_%(class)_changing_documents_related"
这里的%(class)缺少了格式化后缀s,导致Python字符串格式化引擎将%(class)_解析为:占位符%(class)后跟格式字符_,但_不是合法的Python字符串格式符,因此抛出错误。
修复方案
将related_name中的%(class)改为%(class)s,同时可优化related_query_name的复数形式(可选):
修复后的模型代码:
class ChangingDocument(PrivateCommentMixin, models.Model): # Список изменяющих документов. treaty = models.ForeignKey("treaties.Treaty", on_delete=models.CASCADE, blank=False, null=False, related_name="%(app_label)s_%(class)s_related", related_query_name="%(app_label)s_%(class)s", ) changing_document = models.ForeignKey("treaties.Treaty", on_delete=models.CASCADE, blank=False, null=False, related_name="%(app_label)s_%(class)s_changing_documents_related", related_query_name="%(app_label)s_%(class)s_changing_documents", ) def __str__(self): return str(self.changing_document)
验证步骤
- 保存修改后的
models.py文件 - 重新运行迁移命令:
python manage.py makemigrations python manage.py migrate - 确认错误不再出现,迁移正常完成
内容的提问来源于stack exchange,提问作者Kifsif
相关产品推荐
相关产品推荐

