dazai
dazai

Reputation: 716

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

I'm getting this error in my model PedidoPizzaThrough:

__str__ returned non-string (type NoneType)

I assume it's maybe because the fields are null for now but I added the else "" and nothing changes. How do I fix this?

My model is like this:

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

This is the traceback:

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)

Upvotes: 0

Views: 1996

Answers (1)

brno32
brno32

Reputation: 424

It's not immediately obvious, but here's a few suggestions.

Try this for PedidoPizzaThrough's __str__ method

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

Some thoughts:

  • email is a nullable field on Pedido. If you try to str an instance of this mode, you could get this error.

  • Is it possible you have data that made its way into the DB without django? If nombre is null, it's possible that when you try to str the pizza attribute, it will access Pizzas's __str__ method and return a None, so it never gets to actually use your ternary, meaining str(self.pizza) itself is throwing the error.

Upvotes: 2

Related Questions