在通过Django的数据模型类(Models)将应用(APP)的数据在网页上写入Django后端数据库的时候,遇到如题所示的错误;具体如下:

错误信息:

TypeError at /admin/HelloWorld/microblog/add/
__str__ returned non-string (type int)
Request Method:	POST
Request URL:	http://127.0.0.1:8000/admin/HelloWorld/microblog/add/
Django Version:	2.2.2
Exception Type:	TypeError
Exception Value:	
__str__ returned non-string (type int)
Exception Location:	C:\Users\adamhuan\AppData\Local\Programs\Python\Python37\lib\site-packages\django\contrib\admin\options.py in log_addition, line 810
Python Executable:	E:\PyCharm_data\Django_Me\venv\Scripts\python.exe
Python Version:	3.7.2
Python Path:	
['E:\\PyCharm_data\\Django_Me',
 'E:\\PyCharm_data\\Django_Me',
 'C:\\Users\\adamhuan\\AppData\\Local\\JetBrains\\Toolbox\\apps\\PyCharm-P\\ch-0\\191.7141.48\\helpers\\pycharm_display',
 'C:\\Users\\adamhuan\\AppData\\Local\\Programs\\Python\\Python37\\python37.zip',
 'C:\\Users\\adamhuan\\AppData\\Local\\Programs\\Python\\Python37\\DLLs',
 'C:\\Users\\adamhuan\\AppData\\Local\\Programs\\Python\\Python37\\lib',
 'C:\\Users\\adamhuan\\AppData\\Local\\Programs\\Python\\Python37',
 'E:\\PyCharm_data\\Django_Me\\venv',
 'E:\\PyCharm_data\\Django_Me\\venv\\lib\\site-packages',
 'C:\\Users\\adamhuan\\AppData\\Local\\Programs\\Python\\Python37\\lib\\site-packages',
 'C:\\Users\\adamhuan\\AppData\\Local\\JetBrains\\Toolbox\\apps\\PyCharm-P\\ch-0\\191.7141.48\\helpers\\pycharm_matplotlib_backend']
Server time:	星期六, 8 六月 2019 10:40:31 +0800

该错误发生在目标应用的models.py的【def __str__】部分。

发生错误时的代码:

from django.db import models

# Create your models here.

# 导入模块
from django.utils import timezone
from django.contrib.auth.models import User

# 类(数据表)

# 存放微博记录的数据表
# 其中的每一条记录,是一条微博
class MicroBlog(models.Model):

    # 类属性(数据表的字段)

    # 微博记录的编号
    messages_id = models.IntegerField()

    # 微博作者(外键)
    author = models.ForeignKey(User,related_name="micromessage_posts",on_delete=models.CASCADE)

    # 微博记录
    body = models.TextField()

    # 发布时间
    createtime = models.DateTimeField(default=timezone.now())

    # 排序方式(显示顺序)
    class Meta:
        ordering = ("-createtime",)

    def __str__(self):
        return self.id

通过代码的类属性的定义可以知道:
这里,【__str__】函数中,【return】的【self.id】是一个【int】类型。

而页面的报错是【__str__ returned non-string (type int)】。
因此,发生该错误的原因是:在Django中,【__str__】需要返回的值,必须是字符类型(string)。
在前面的环境中,我反悔的不是字符串,而是数值,因此出错。

修改代码如下:

from django.db import models

# Create your models here.

# 导入模块
from django.utils import timezone
from django.contrib.auth.models import User

# 类(数据表)

# 存放微博记录的数据表
# 其中的每一条记录,是一条微博
class MicroBlog(models.Model):

    # 类属性(数据表的字段)

    # 微博记录的编号
    messages_id = models.IntegerField()

    # 微博作者(外键)
    author = models.ForeignKey(User,related_name="micromessage_posts",on_delete=models.CASCADE)

    # 微博记录
    body = models.TextField()

    # 发布时间
    createtime = models.DateTimeField(default=timezone.now())

    # 排序方式(显示顺序)
    class Meta:
        ordering = ("-createtime",)

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

在返回【self.id】的时候,通过【str()】函数转换成字符串。

然后,页面上,再次操作插入数据,就没问题了:

————————————
Done。

说点什么

avatar

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

  Subscribe  
提醒