繁体   English   中英

__str__ 返回非字符串(NoneType 类型),因为该字段是 null

[英]__str__ returned non-string (type NoneType) because the field is null

我的 model PedidoPizzaThrough 中出现此错误:

__str__ returned non-string (type NoneType)

我认为这可能是因为这些字段现在是 null 但我添加了 else "" 并且没有任何变化。 我该如何解决?

我的 model 是这样的:

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)

这不是很明显,但这里有一些建议。

试试这个PedidoPizzaThrough__str__方法

def __str__(self):
    if not self.pizza:
        return ""
    return str(self.pizza)

一些想法:

  • emailPedido上的可为空字段。 如果您尝试str此模式的实例,您可能会收到此错误。

  • 您是否有可能在没有 django 的情况下将数据输入数据库? 如果nombre是 null,则当您尝试str pizza属性时,它可能会访问Pizzas__str__方法并返回None ,因此它永远不会真正使用您的三元, str(self.pizza)本身正在抛出错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM