首页 > 解决方案 > Django TypeError:__str__ 返回非字符串(模型名称)

问题描述

我的 models.py 中有以下表格

class ScanTarget(models.Model):
    scan_target = models.CharField(primary_key=True, max_length=60)
    scan_count = models.IntegerField(default=1)
    last_scan = models.DateTimeField(default=timezone.now, blank=True, null=True)
    created = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return str(self.scan_target)
class RawScanResults(models.Model):
    scan_target = models.ForeignKey(ScanTarget, on_delete=models.CASCADE,
                         related_name='raw_results')
    result_uid = models.UUIDField()
    start = models.DateTimeField(default=timezone.now, db_index=True)
    finish = models.DateTimeField(null= True, blank=True, db_index=True)
    score = models.TextField(max_length=5, blank=True, null=True)

    def __str__(self):
        return str('test')

当我想在我的views.py中使用 ScanTarget 的外键实例化一个新的 RawScanResults 时,就会出现问题,如下所示:

if not ScanTarget.objects.filter(scan_target=domain).exists():
    obj=ScanTarget(scan_target=domain)
    obj.save()
    uid = str(uuid4())
    RawScanResults.objects.create(scan_target=obj,
                                  result_uid = uid,
                                  start = timezone.now(),
                                  )

我不断收到此错误:TypeError: __str__ returned non-string (type ScanTarget)我尝试修改def __str__这两个类或将它们注释掉,但它一直给我同样的错误。我在这里做错了什么?

更新: 这是我遵循的manage.py shell

In [119]: a=ScanTarget(scan_target='yahoo.com')

In [120]: uid
Out[120]: '1a5b2732-69f0-457a-8ec0-c6232662577e'

In [121]: a.save()

In [122]: b = RawScanResults(scan_target=a, result_uid=uid)

In [123]: b
Out[123]: ---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
~/.virtualenvs/djangodev/lib/python3.5/site-packages/IPython/core/formatters.py in __call__(self, obj)
    700                 type_pprinters=self.type_printers,
    701                 deferred_pprinters=self.deferred_printers)
--> 702             printer.pretty(obj)
    703             printer.flush()
    704             return stream.getvalue()

~/.virtualenvs/djangodev/lib/python3.5/site-packages/IPython/lib/pretty.py in pretty(self, obj)
    393                             if callable(meth):
    394                                 return meth(obj, self, cycle)
--> 395             return _default_pprint(obj, self, cycle)
    396         finally:
    397             self.end_group()

~/.virtualenvs/djangodev/lib/python3.5/site-packages/IPython/lib/pretty.py in _default_pprint(obj, p, cycle)
    508     if _safe_getattr(klass, '__repr__', None) is not object.__repr__:
    509         # A user-provided repr. Find newlines and replace them with p.break_()
--> 510         _repr_pprint(obj, p, cycle)
    511         return
    512     p.begin_group(1, '<')

~/.virtualenvs/djangodev/lib/python3.5/site-packages/IPython/lib/pretty.py in _repr_pprint(obj, p, cycle)
    699     """A pprint that just redirects to the normal repr function."""
    700     # Find newlines and replace them with p.break_()
--> 701     output = repr(obj)
    702     for idx,output_line in enumerate(output.splitlines()):
    703         if idx:

~/.virtualenvs/djangodev/lib/python3.5/site-packages/django/db/models/base.py in __repr__(self)
    511 
    512     def __repr__(self):
--> 513         return '<%s: %s>' % (self.__class__.__name__, self)
    514 
    515     def __str__(self):

TypeError: __str__ returned non-string (type ScanTarget)

标签: pythondjango

解决方案


我删除了所有的数据库表,并发出了python manage.py makemigrationsand python manage.py migrate,我的问题得到了解决。

我不知道究竟是什么导致了这个问题。


推荐阅读