Python Django模型对象的复杂字符串表示形式(def _str__(self):)
我已经用它来处理模型对象的可读名称有一段时间了,但最近我遇到了一些奇怪的崩溃和bug,它们似乎与这个函数有关 我有两种型号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
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