【问题标题】:__str__ returned non-string (type datetime.date)__str__ 返回非字符串(类型 datetime.date)
【发布时间】:2020-11-23 20:53:47
【问题描述】:

在 Django 中,我有 2 个模型:

inventory/models.py:

class Transaction(models.Model):
    date = models.DateField()
    product = models.ForeignKey(
        Product, on_delete=models.PROTECT)
    type = models.ForeignKey(TransactionType, on_delete=models.PROTECT)
    quantity = models.IntegerField()
    location = models.ForeignKey(Location, on_delete=models.PROTECT)
    note = models.TextField(null=True, blank=True)

    def __str__(self) -> str:
        return f'{self.date}, {self.product.name}, {self.type.name}'

而且它工作正常。

另一方面。这个模型在sales/models.py

class Sale(models.Model):
    date = models.DateField()
    sale_id = models.IntegerField()
    sku = models.CharField(max_length=10)
    product = models.CharField(max_length=100)
    quantity = models.IntegerField()
    price = models.FloatField()
    channel = models.CharField(max_length=100)
    nooks_payout_schedule = models.ForeignKey(
        NooksPayoutSchedule, on_delete=models.RESTRICT, blank=True, null=True)

    def __str__(self) -> str:
        return f'{self.date}, {self.product}'

给我错误:__str__ returned non-string (type datetime.date)

尝试在管理仪表板中查看销售记录的详细信息时。库存记录我看没问题。

我尝试了什么 我尝试使用str(self.date),但还是同样的错误。

我看不出这 2 个模型之间的区别,但它们的工作方式不同。你知道为什么吗?

完整跟踪

Environment:


Request Method: GET
Request URL: http://localhost:8000/admin/sales/sale/160/change/

Django Version: 3.1.2
Python Version: 3.8.5
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'rest_framework',
 'sales',
 'inventory',
 'graphene_django',
 'corsheaders',
 'django_pivot',
 'drf_spectacular',
 'django_extensions']
Installed Middleware:
['django.middleware.security.SecurityMiddleware',
 'corsheaders.middleware.CorsMiddleware',
 '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 /home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/contrib/admin/templates/admin/includes/fieldset.html, error at line 19
   __str__ returned non-string (type datetime.date)
   9 :             {% for field in line %}
   10 :                 <div{% if not line.fields|length_is:'1' %} class="fieldBox{% if field.field.name %} field-{{ field.field.name }}{% endif %}{% if not field.is_readonly and field.errors %} errors{% endif %}{% if field.field.is_hidden %} hidden{% endif %}"{% elif field.is_checkbox %} class="checkbox-row"{% endif %}>
   11 :                     {% if not line.fields|length_is:'1' and not field.is_readonly %}{{ field.errors }}{% endif %}
   12 :                     {% if field.is_checkbox %}
   13 :                         {{ field.field }}{{ field.label_tag }}
   14 :                     {% else %}
   15 :                         {{ field.label_tag }}
   16 :                         {% if field.is_readonly %}
   17 :                             <div class="readonly">{{ field.contents }}</div>
   18 :                         {% else %}
   19 :                              {{ field.field }} 
   20 :                         {% endif %}
   21 :                     {% endif %}
   22 :                     {% if field.field.help_text %}
   23 :                         <div class="help">{{ field.field.help_text|safe }}</div>
   24 :                     {% endif %}
   25 :                 </div>
   26 :             {% endfor %}
   27 :         </div>
   28 :     {% endfor %}
   29 : </fieldset>


Traceback (most recent call last):
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
    response = get_response(request)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/core/handlers/base.py", line 202, in _get_response
    response = response.render()
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/response.py", line 105, in render
    self.content = self.rendered_content
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/response.py", line 83, in rendered_content
    return template.render(context, self._request)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/backends/django.py", line 61, in render
    return self.template.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 170, in render
    return self._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 150, in render
    return compiled_parent._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 62, in render
    result = block.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/loader_tags.py", line 192, in render
    return template.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 172, in render
    return self._render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 162, in _render
    return self.nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 211, in render
    nodelist.append(node.render_annotated(context))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/defaulttags.py", line 312, in render
    return nodelist.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 938, in render
    bit = node.render_annotated(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 905, in render_annotated
    return self.render(context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 994, in render
    return render_value_in_context(output, context)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/template/base.py", line 973, in render_value_in_context
    value = str(value)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/utils/html.py", line 376, in <lambda>
    klass.__str__ = lambda self: mark_safe(klass_str(self))
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/boundfield.py", line 34, in __str__
    return self.as_widget()
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/boundfield.py", line 93, in as_widget
    return widget.render(
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 241, in render
    context = self.get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/contrib/admin/widgets.py", line 283, in get_context
    'rendered_widget': self.widget.render(name, value, attrs),
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 241, in render
    context = self.get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 678, in get_context
    context = super().get_context(name, value, attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 639, in get_context
    context['widget']['optgroups'] = self.optgroups(name, context['widget']['value'], attrs)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/widgets.py", line 587, in optgroups
    for index, (option_value, option_label) in enumerate(self.choices):
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1157, in __iter__
    yield self.choice(obj)
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1171, in choice
    self.field.label_from_instance(obj),
  File "/home/tomo/anaconda3/envs/vdora/lib/python3.8/site-packages/django/forms/models.py", line 1240, in label_from_instance
    return str(obj)

Exception Type: TypeError at /admin/sales/sale/160/change/
Exception Value: __str__ returned non-string (type datetime.date)

更新

问题是销售类的外键:


class NooksPayoutSchedule(models.Model):
    start_date = DateField()
    end_date = DateField()
    payout_date = DateField()
    is_picked = BooleanField()

    def __str__(self) -> str:
        return self.payout_date

【问题讨论】:

  • 您确定这是引发错误的模型吗?你能分享一下完整的回溯吗?
  • 可能(可能)它只是由 another 模型提出的。也许你在这里使用的模型像Product,这样当你在Salestr(...) 时,你也在Productstr(..),因此出现错误。
  • @WillemVanOnsem 我发布了 taceback。这就是你所说的完全后退的意思吗?请查收,谢谢
  • @WillemVanOnsem 你是对的,Sale 模型中的外键是返回日期。
  • 你能显示产品类吗?

标签: django django-orm


【解决方案1】:

我遇到了这个问题,我已经解决了以下问题。你是对的问题来自ForeignKey的模型。

我将我的str函数改成如下(这是foreingkey的模型str函数):

def __str__(self):
        return str(self.someFieldName)

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2018-03-02
    • 2020-04-19
    • 2018-08-16
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多