我有一个项目,其中主列名称是'N‘,而不是标准的'id’。我无法访问原始数据库来更改它,所以我希望下面的代码可以做到这一点:
class ExSLoc(models.Model):
id = models.IntegerField(primary_key=True, db_column='n')
class Meta:
db_table = original_db_table
managed = False
它确实是这样的,但我在Django模型表单中遇到了一个奇怪的bug,告诉我:
'ExSLoc' object has no attribute 'id'
这是完整的回溯。
| Traceback (most recent call last):
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 174, in get_response
website_1 | response = self.process_exception_by_middleware(e, request)
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/core/handlers/base.py", line 172, in get_response
website_1 | response = response.render()
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 160, in render
website_1 | self.content = self.rendered_content
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/template/response.py", line 137, in rendered_content
website_1 | content = template.render(context, self._request)
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/template/backends/jinja2.py", line 70, in render
website_1 | return self.template.render(context)
website_1 | File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 1090, in render
website_1 | self.environment.handle_exception()
website_1 | File "/usr/local/lib/python2.7/dist-packages/jinja2/environment.py", line 832, in handle_exception
website_1 | reraise(*rewrite_traceback_stack(source=source))
website_1 | File "/opt/project/templates/rfs_submission/rfs_new_0.html", line 1, in top-level template code
website_1 | {% extends "rfs_submission/rfs_new.html" %}
website_1 | File "/opt/project/templates/rfs_submission/rfs_new.html", line 9, in top-level template code
website_1 | {% if rfs.rfstype_id == 'RFSTTR' and step == 1 %}
website_1 | File "/opt/project/templates/layout_modern.html", line 40, in top-level template code
website_1 | {% block body %}
website_1 | File "/opt/project/templates/rfs_submission/rfs_new.html", line 65, in block "body"
website_1 | {% block form %}{% endblock %}
website_1 | File "/opt/project/templates/rfs_submission/rfs_new_0.html", line 4, in block "form"
website_1 | {% set field=form.loc %}{% include "partials/form_input_tr.html" %}
website_1 | File "/opt/project/templates/partials/form_input_tr.html", line 8, in top-level template code
website_1 | {{ field }}
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/utils/html.py", line 381, in <lambda>
website_1 | klass.__unicode__ = lambda self: mark_safe(klass_unicode(self))
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/forms/boundfield.py", line 43, in __str__
website_1 | return self.as_widget()
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/forms/boundfield.py", line 101, in as_widget
website_1 | return force_text(widget.render(name, self.value(), attrs=attrs))
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/forms/boundfield.py", line 148, in value
website_1 | return self.field.prepare_value(data)
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/forms/models.py", line 1204, in prepare_value
website_1 | return value.pk
website_1 | File "/usr/local/lib/python2.7/dist-packages/django/db/models/base.py", line 536, in _get_pk_val
website_1 | return getattr(self, meta.pk.attname)
website_1 | AttributeError: 'ExSLoc' object has no attribute 'id'
发布于 2020-11-18 06:59:51
您可以强制Django忽略id字段,方法是在另一个字段中设置primary_key=True
。
因此,如果您希望将id替换为n,则应该更改您的模型:
class ExSloc(models.Model):
n = models.AutoField(primary_key=True)
请注意,AutoField用于在创建模型的新对象时自动增加字段值。
https://stackoverflow.com/questions/64888222
复制