【问题标题】:Connecting Django models to tables with primary key name other than ID将 Django 模型连接到主键名称不是 ID 的表
【发布时间】:2021-03-01 10:25:40
【问题描述】:

我有一个项目,其中主列名称是“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 模型表单中遇到了一个奇怪的错误,告诉我:

'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'

【问题讨论】:

    标签: django django-forms django-orm


    【解决方案1】:

    您可以通过在另一个字段中设置 primary_key=True 来强制 Django 忽略 id 字段。

    所以如果你想用 n 替换 id,你应该改变你的模型:

    class ExSloc(models.Model):
        n = models.AutoField(primary_key=True)
    

    请注意,AutoField用于在创建新的模型对象时自动增加字段值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-24
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-18
      相关资源
      最近更新 更多