Python Django模型对象的复杂字符串表示形式(def _str__(self):)

Python Django模型对象的复杂字符串表示形式(def _str__(self):),python,django,django-models,django-forms,django-templates,Python,Django,Django Models,Django Forms,Django Templates,我已经用它来处理模型对象的可读名称有一段时间了,但最近我遇到了一些奇怪的崩溃和bug,它们似乎与这个函数有关 我有两种型号SensorAssignment和SnComplex,它们都与第三种型号RadioSn上的一列有一对一的关系无线电n是所有序列号的主池SnComplex是分配给客户的序列列表,SensorAssignment处理分配给特定物理位置的客户序列的元数据 需要注意的是,这是我继承的遗留数据库。有些关系并不理想 以下是模型的简化版本,仅包含相关列 收音机n class RadioSn

我已经用它来处理模型对象的可读名称有一段时间了,但最近我遇到了一些奇怪的崩溃和bug,它们似乎与这个函数有关

我有两种型号
SensorAssignment
SnComplex
,它们都与第三种型号
RadioSn
上的一列有一对一的关系<代码>无线电n是所有序列号的主池
SnComplex
是分配给客户的序列列表,
SensorAssignment
处理分配给特定物理位置的客户序列的元数据

需要注意的是,这是我继承的遗留数据库。有些关系并不理想

以下是模型的简化版本,仅包含相关列

收音机n

class RadioSn(models.Model):
    sn = models.AutoField(primary_key=True)
    role = models.ForeignKey('Roles', db_column='role', on_delete=models.DO_NOTHING)

    class Meta:
        managed = False
        db_table = 'radio_sn'
        ordering = ['sn']

    def __str__(self):
        return '%s -- %s' % (self.sn, self.role)
SnComplex

class SnComplex(models.Model):
sn = models.OneToOneField(RadioSn, on_delete=models.DO_NOTHING, db_column='sn', primary_key=True)
complex = models.ForeignKey(Complex, on_delete=models.DO_NOTHING, db_column='complex')

class Meta:
    managed = False
    db_table = 'sn_complex'
传感器分配

class SensorAssignment(models.Model):
unit = models.ForeignKey('Unit', on_delete=models.DO_NOTHING, db_column='unit')
sn = models.OneToOneField(RadioSn, on_delete=models.DO_NOTHING, db_column='sn')

class Meta:
    managed = False
    db_table = 'sensor_assignment'
    ordering = ['sn']

def __str__(self):
    return self.pk
这就是我们开始遇到我的问题的地方。我使用
form.ModelForm
来处理
SensorAssignment
对象的创建和维护。因此,对于
sn
字段,它创建了一个html
,其中包含
RadioSn
对象的选择,这些对象由上面描述的str格式表示(一个由int主键
sn
和外键
角色
[bad naming IMHO]组成的字符串)

这非常有效(我确实将查询集限制为视图上窗体初始化的相关选项,因此它不是模型中的
all()
对象。)

所以我应该能够为
SnComplex
做同样的事情,对吗?毕竟,每个模型在各自的
sn
列上与
RadioSn
具有相同的关系,并且
str
表示
RadioSn
对象是在该模型上完成的

不,这是我得到的

如果我只是将
RadioSn
对象表示为
self.sn
,而不是将
self.sn
self.role
连接起来,它可以在两种形式上工作,但如果我将其连接起来,则会使
SnComplex
形式崩溃。所有
RadioSn
对象都有一个角色值

知道发生了什么事吗?我们有一个
RadioSn
模型对象的字符串表示,它在模板渲染上破坏了
SnComplex
ModelForm
,但在其他地方的多个版本
SensorAssignment
ModelForm
上运行良好

请求的复杂表单:

class AddSensorForm(forms.ModelForm):
    class Meta:
        model = SnComplex
        fields = '__all__'
Request Method: GET
Request URL: http://127.0.0.1/complex/33/

Django Version: 2.0.4
Python Version: 3.6.1
Installed Applications:
['apps.dashboard',
 'rest_framework',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'apps.dashboard.templatetags.custom_filters',
 'widget_tweaks',
 'phonenumber_field',
 'pygal',
 'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\git\si-dash\apps\dashboard\templates\header.html, error at line 0
   Roles matching query does not exist.
   1 : {% load static %}
   2 : {% load widget_tweaks %}
   3 : {% load custom_filters %}
   4 : {% csrf_token %}
   5 : 
   6 : <!DOCTYPE html>
   7 : <html lang="en">
   8 : 
   9 : <head>
   10 :     <meta charset="utf-8">


Traceback:

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  158.             rel_obj = self.field.get_cached_value(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\mixins.py" in get_cached_value
  13.             return instance._state.fields_cache[cache_name]

During handling of the above exception ('role'), another exception occurred:

File "C:\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Python36\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\git\si-dash\apps\dashboard\views\complex.py" in complex
  179.     return render(request, 'design/complex.html', passed_data)

File "C:\Python36\lib\site-packages\django\shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Python36\lib\site-packages\django\template\loader.py" in render_to_string
  62.     return template.render(context, request)

File "C:\Python36\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  175.                     return self._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  314.                 return nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  211.                     nodelist.append(node.render_annotated(context))

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in render
  187.         return str(bounded_field)

File "C:\Python36\lib\site-packages\django\utils\html.py" in <lambda>
  380.     klass.__str__ = lambda self: mark_safe(klass_str(self))

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in __str__
  36.         return self.as_widget()

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in as_widget
  118.             **kwargs

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in render
  234.         context = self.get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  677.         context = super().get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  637.         context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in optgroups
  585.         for index, (option_value, option_label) in enumerate(self.choices):

File "C:\Python36\lib\site-packages\django\forms\models.py" in __iter__
  1141.             yield self.choice(obj)

File "C:\Python36\lib\site-packages\django\forms\models.py" in choice
  1147.         return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

File "C:\Python36\lib\site-packages\django\forms\models.py" in label_from_instance
  1213.         return str(obj)

File "C:\git\si-dash\apps\dashboard\models.py" in __str__
  728.         return '%s -- %s' % (self.sn, self.role)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  164.                 rel_obj = self.get_object(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in get_object
  139.         return qs.get(self.field.get_reverse_related_filter(instance))

File "C:\Python36\lib\site-packages\django\db\models\query.py" in get
  403.                 self.model._meta.object_name

Exception Type: DoesNotExist at /complex/33/
Exception Value: Roles matching query does not exist.
完全回溯:

class AddSensorForm(forms.ModelForm):
    class Meta:
        model = SnComplex
        fields = '__all__'
Request Method: GET
Request URL: http://127.0.0.1/complex/33/

Django Version: 2.0.4
Python Version: 3.6.1
Installed Applications:
['apps.dashboard',
 'rest_framework',
 'django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'apps.dashboard.templatetags.custom_filters',
 'widget_tweaks',
 'phonenumber_field',
 'pygal',
 'django_filters']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']


Template error:
In template C:\git\si-dash\apps\dashboard\templates\header.html, error at line 0
   Roles matching query does not exist.
   1 : {% load static %}
   2 : {% load widget_tweaks %}
   3 : {% load custom_filters %}
   4 : {% csrf_token %}
   5 : 
   6 : <!DOCTYPE html>
   7 : <html lang="en">
   8 : 
   9 : <head>
   10 :     <meta charset="utf-8">


Traceback:

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  158.             rel_obj = self.field.get_cached_value(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\mixins.py" in get_cached_value
  13.             return instance._state.fields_cache[cache_name]

During handling of the above exception ('role'), another exception occurred:

File "C:\Python36\lib\site-packages\django\core\handlers\exception.py" in inner
  35.             response = get_response(request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  128.                 response = self.process_exception_by_middleware(e, request)

File "C:\Python36\lib\site-packages\django\core\handlers\base.py" in _get_response
  126.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Python36\lib\site-packages\django\contrib\auth\decorators.py" in _wrapped_view
  21.                 return view_func(request, *args, **kwargs)

File "C:\git\si-dash\apps\dashboard\views\complex.py" in complex
  179.     return render(request, 'design/complex.html', passed_data)

File "C:\Python36\lib\site-packages\django\shortcuts.py" in render
  36.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Python36\lib\site-packages\django\template\loader.py" in render_to_string
  62.     return template.render(context, request)

File "C:\Python36\lib\site-packages\django\template\backends\django.py" in render
  61.             return self.template.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  175.                     return self._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  155.             return compiled_parent._render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in _render
  167.         return self.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\loader_tags.py" in render
  67.                 result = block.nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  314.                 return nodelist.render(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render
  943.                 bit = node.render_annotated(context)

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\django\template\defaulttags.py" in render
  211.                     nodelist.append(node.render_annotated(context))

File "C:\Python36\lib\site-packages\django\template\base.py" in render_annotated
  910.             return self.render(context)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in render
  187.         return str(bounded_field)

File "C:\Python36\lib\site-packages\django\utils\html.py" in <lambda>
  380.     klass.__str__ = lambda self: mark_safe(klass_str(self))

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in __str__
  36.         return self.as_widget()

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\widget_tweaks\templatetags\widget_tweaks.py" in as_widget
  31.         html = old_as_widget(widget, attrs, only_initial)

File "C:\Python36\lib\site-packages\django\forms\boundfield.py" in as_widget
  118.             **kwargs

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in render
  234.         context = self.get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  677.         context = super().get_context(name, value, attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in get_context
  637.         context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)

File "C:\Python36\lib\site-packages\django\forms\widgets.py" in optgroups
  585.         for index, (option_value, option_label) in enumerate(self.choices):

File "C:\Python36\lib\site-packages\django\forms\models.py" in __iter__
  1141.             yield self.choice(obj)

File "C:\Python36\lib\site-packages\django\forms\models.py" in choice
  1147.         return (self.field.prepare_value(obj), self.field.label_from_instance(obj))

File "C:\Python36\lib\site-packages\django\forms\models.py" in label_from_instance
  1213.         return str(obj)

File "C:\git\si-dash\apps\dashboard\models.py" in __str__
  728.         return '%s -- %s' % (self.sn, self.role)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in __get__
  164.                 rel_obj = self.get_object(instance)

File "C:\Python36\lib\site-packages\django\db\models\fields\related_descriptors.py" in get_object
  139.         return qs.get(self.field.get_reverse_related_filter(instance))

File "C:\Python36\lib\site-packages\django\db\models\query.py" in get
  403.                 self.model._meta.object_name

Exception Type: DoesNotExist at /complex/33/
Exception Value: Roles matching query does not exist.
请求方法:获取
请求URL:http://127.0.0.1/complex/33/
Django版本:2.0.4
Python版本:3.6.1
已安装的应用程序:
['apps.dashboard',
“rest_框架”,
“django.contrib.admin”,
“django.contrib.auth”,
“django.contrib.contenttypes”,
“django.contrib.sessions”,
“django.contrib.messages”,
“django.contrib.staticfiles”,
'应用程序.仪表板.模板标签.自定义过滤器',
“widget_调整”,
'电话号码\字段',
“pygal”,
“django_过滤器”]
已安装的中间件:
['django.middleware.security.SecurityMiddleware',
“django.contrib.sessions.middleware.SessionMiddleware”,
'django.middleware.common.CommonMiddleware',
“django.middleware.csrf.CsrfViewMiddleware”,
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.xframeoptions中间件']
模板错误:
在模板C:\git\si dash\apps\dashboard\templates\header.html中,第0行出现错误
角色匹配查询不存在。
1:{%load static%}
2:{%load widget_tweaks%}
3:{%load custom_filters%}
4:{%csrf_令牌%}
5 : 
6 : 
7 : 
8 : 
9 : 
10 :     
回溯:
get中的文件“C:\Python36\lib\site packages\django\db\models\fields\related\u descriptors.py”__
158rel_obj=self.field.get_缓存值(实例)
get\u cached\u值中的文件“C:\Python36\lib\site packages\django\db\models\fields\mixins.py”
13返回实例。\u state.fields\u缓存[cache\u name]
在处理上述异常(“角色”)期间,发生了另一个异常:
文件“C:\Python36\lib\site packages\django\core\handlers\exception.py”位于内部
35响应=获取响应(请求)
get响应中的文件“C:\Python36\lib\site packages\django\core\handlers\base.py”
128response=self.process\u异常\u由\u中间件(e,请求)
get响应中的文件“C:\Python36\lib\site packages\django\core\handlers\base.py”
126响应=包装的回调(请求,*回调参数,**回调参数)
视图中的文件“C:\Python36\lib\site packages\django\contrib\auth\decorators.py”
21返回视图功能(请求,*args,**kwargs)
复杂文件中的文件“C:\git\si dash\apps\dashboard\views\complex.py”
179返回呈现(请求'design/complex.html',传递的_数据)
render中的文件“C:\Python36\lib\site packages\django\shortcuts.py”
36content=loader.render_to_string(模板名称、上下文、请求、using=using)
文件“C:\Python36\lib\site packages\django\template\loader.py”位于render\u to\u字符串中
62返回template.render(上下文、请求)
render中的文件“C:\Python36\lib\site packages\django\template\backends\django.py”
61返回self.template.render(上下文)
render中的文件“C:\Python36\lib\site packages\django\template\base.py”
175返回self.\u呈现(上下文)
文件“C:\Python36\lib\site packages\django\template\base.py”位于\u render中
167返回self.nodelist.render(上下文)
render中的文件“C:\Python36\lib\site packages\django\template\base.py”
943位=节点。带注释的渲染(上下文)
render_注释中的文件“C:\Python36\lib\site packages\django\template\base.py”
910返回self.render(上下文)
render中的文件“C:\Python36\lib\site packages\django\template\loader\u tags.py”
15