python - __str__ 返回非字符串(NoneType 类型),因为该字段为空
问题描述
我的模型 PedidoPizzaThrough 中出现此错误:
__str__ returned non-string (type NoneType)
我认为这可能是因为这些字段现在为空,但我添加了 else "" 并且没有任何变化。我该如何解决?
我的模型是这样的:
class Pizzas(models.Model):
nombre = models.CharField(max_length=100, unique=True)
cant = models.IntegerField(default=0)
def __str__(self):
return self.nombre
class Pedido(models.Model):
fecha = models.DateField(auto_now_add=True)
email = models.EmailField(max_length=200, null=True)
telefono = models.IntegerField(null=True)
pizzas = models.ManyToManyField('Pizzas', through='PedidoPizzaThrough', related_name='pedidos')
cantidad = models.IntegerField(default=0)
def __str__(self):
return self.email
class PedidoPizzaThrough(models.Model):
pizza = models.ForeignKey(Pizzas, on_delete=models.PROTECT)
pedido = models.ForeignKey(Pedido, on_delete=models.PROTECT)
cantidad = models.IntegerField()
def __str__(self):
return str(self.pizza) if str(self.pizza) else ""
这是回溯:
django-challenge-back | Traceback (most recent call last):
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
django-challenge-back | response = get_response(request)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 204, in _get_response
django-challenge-back | response = response.render()
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 105, in render
django-challenge-back | self.content = self.rendered_content
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/response.py", line 70, in rendered_content
django-challenge-back | ret = renderer.render(self.data, accepted_media_type, context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 724, in render
django-challenge-back | context = self.get_context(data, accepted_media_type, renderer_context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 696, in get_context
django-challenge-back | 'post_form': self.get_rendered_html_form(data, view, 'POST', request),
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 511, in get_rendered_html_form
django-challenge-back | return self.render_form_for_serializer(serializer)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 518, in render_form_for_serializer
django-challenge-back | return form_renderer.render(
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 372, in render
django-challenge-back | return template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
django-challenge-back | return self.template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 170, in render
django-challenge-back | return self._render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
django-challenge-back | return self.nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 211, in render
django-challenge-back | nodelist.append(node.render_annotated(context))
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 312, in render
django-challenge-back | return nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/library.py", line 192, in render
django-challenge-back | output = self.func(*resolved_args, **resolved_kwargs)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/templatetags/rest_framework.py", line 87, in render_field
django-challenge-back | return renderer.render_field(field, style)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 351, in render_field
django-challenge-back | return template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
django-challenge-back | return self.template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 170, in render
django-challenge-back | return self._render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
django-challenge-back | return self.nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 163, in render
django-challenge-back | values = self.sequence.resolve(context, ignore_failures=True)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 671, in resolve
django-challenge-back | obj = self.var.resolve(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 796, in resolve
django-challenge-back | value = self._resolve_lookup(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 858, in _resolve_lookup
django-challenge-back | current = current()
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 220, in iter_options
django-challenge-back | self.get_choices(cutoff=self.html_cutoff),
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 202, in get_choices
django-challenge-back | return OrderedDict([
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 205, in <listcomp>
django-challenge-back | self.display_value(item)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 226, in display_value
django-challenge-back | return str(instance)
django-challenge-back | TypeError: __str__ returned non-string (type NoneType)
django-challenge-back | [18/Apr/2021 23:51:17] "GET /pizzadelmes HTTP/1.1" 500 220029
django-challenge-back | Internal Server Error: /pizzadelmes
django-challenge-back | Traceback (most recent call last):
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/exception.py", line 47, in inner
django-challenge-back | response = get_response(request)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/core/handlers/base.py", line 204, in _get_response
django-challenge-back | response = response.render()
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/response.py", line 105, in render
django-challenge-back | self.content = self.rendered_content
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/response.py", line 70, in rendered_content
django-challenge-back | ret = renderer.render(self.data, accepted_media_type, context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 724, in render
django-challenge-back | context = self.get_context(data, accepted_media_type, renderer_context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 696, in get_context
django-challenge-back | 'post_form': self.get_rendered_html_form(data, view, 'POST', request),
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 511, in get_rendered_html_form
django-challenge-back | return self.render_form_for_serializer(serializer)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 518, in render_form_for_serializer
django-challenge-back | return form_renderer.render(
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 372, in render
django-challenge-back | return template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
django-challenge-back | return self.template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 170, in render
django-challenge-back | return self._render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
django-challenge-back | return self.nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 211, in render
django-challenge-back | nodelist.append(node.render_annotated(context))
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 312, in render
django-challenge-back | return nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/library.py", line 192, in render
django-challenge-back | output = self.func(*resolved_args, **resolved_kwargs)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/templatetags/rest_framework.py", line 87, in render_field
django-challenge-back | return renderer.render_field(field, style)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/renderers.py", line 351, in render_field
django-challenge-back | return template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/backends/django.py", line 61, in render
django-challenge-back | return self.template.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 170, in render
django-challenge-back | return self._render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 162, in _render
django-challenge-back | return self.nodelist.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 938, in render
django-challenge-back | bit = node.render_annotated(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 905, in render_annotated
django-challenge-back | return self.render(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/defaulttags.py", line 163, in render
django-challenge-back | values = self.sequence.resolve(context, ignore_failures=True)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 671, in resolve
django-challenge-back | obj = self.var.resolve(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 796, in resolve
django-challenge-back | value = self._resolve_lookup(context)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/django/template/base.py", line 858, in _resolve_lookup
django-challenge-back | current = current()
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 220, in iter_options
django-challenge-back | self.get_choices(cutoff=self.html_cutoff),
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 202, in get_choices
django-challenge-back | return OrderedDict([
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 205, in <listcomp>
django-challenge-back | self.display_value(item)
django-challenge-back | File "/usr/local/lib/python3.9/site-packages/rest_framework/relations.py", line 226, in display_value
django-challenge-back | return str(instance)
django-challenge-back | TypeError: __str__ returned non-string (type NoneType)
解决方案
这不是很明显,但这里有一些建议。
试试这个 forPedidoPizzaThrough
的__str__
方法
def __str__(self):
if not self.pizza:
return ""
return str(self.pizza)
一些想法:
email
是 上的一个可为空的字段Pedido
。如果您尝试str
使用此模式的实例,您可能会收到此错误。您是否有可能在没有 django 的情况下将数据输入数据库?如果
nombre
为 null,则当您尝试使用str
该pizza
属性时,它可能会访问Pizzas
's__str__
方法并返回 aNone
,因此它永远不会真正使用您的三元组,这意味着str(self.pizza)
它本身会引发错误。
推荐阅读
- reactjs - 从登录名通过useContext传递图像时,图像未显示
- spring-boot - 使用spring boot创建下载功能以从服务器下载文件
- ios - 有什么方法可以让按钮在第一次按下时做某事,而在 Swift 中的第二次按下时做其他事情
- datetime - 如何使用 Ms Access Date/Time Extended 数据类型
- java - 删除选定 Spinner 上的所有 liveData 和 Observer
- r - 函数返回数字而不是团队?
- makefile - 如何在 Windows 上的 hunspell 搜索路径中添加字典路径?
- java - 来自多个活动的意图
- reactjs - 为什么 scrollToEnd() 在 Android 上不起作用?
- ms-access - 以 Access 连续形式对计算控件求和