python __unicode__这个的作用是什么啊?

看django操作数据库的时候 有写

def __unicode__(self)

这么写的作用是什么啊?

阅读 26.6k
3 个回答

这个__str__的作用是美化打印出来的结果,使人类更方便查看。看下面例子,如果没有__st__方法,打印的结果是<__main__.Test object at 0x0000022D6D1387B8>格式,有了__str__方法后,打印时会按照__str__定义的格式来打印,打印结果为Name:xiaoming。

class Test:

    def __init__(self, name, job):
        self.name = name
        self.job = job

    def __str__(self):
        return 'Name:' + self.name
instance = Test('xiaoming', 'Teacher')
print(instance)

在Django中,如果用的是Python3的话就只能用__str__方法,如果是Python2的话就使用__unicode__方法。因为更安全一些。看看文档图片描述

谢邀

其实楼上@InjetLee 说的基本很到位了,具体到Django中,在 Models中定义这个__unicode__(python3为__str__)方法与否,最直接的感受就是你访问admin所看到的内容是否友好。

下面,举个栗子:

class Question(models.Model):
    question_text = models.CharField('question text', max_length=200)
    pub_date = models.DateTimeField('date published')

    class Meta:
        verbose_name = 'question'
        verbose_name_plural = verbose_name
        ordering = ['-id']

    def __str__(self):
        return self.question_text

上面的models来自django官方教程,在上面的models中,我定义了一个名为Question的models,此时,访问django的后台admin,看到的内容是这样的

clipboard.png

可以发现,Question看到的内容就是我们上面返回的self.question_text(如果你返回的是其它数据,则看到结果的会不同),那么,如果此时将上述代码注释掉,也就是变成下面这样,会发生什么呢?

class Question(models.Model):
    question_text = models.CharField('question text', max_length=200)
    pub_date = models.DateTimeField('date published')

    class Meta:
        verbose_name = 'question'
        verbose_name_plural = verbose_name
        ordering = ['-id']
    # 
    # def __str__(self):
    #     return self.question_text

此时,再去后台admin里面查看Question,则变成了这样:

clipboard.png

你定义的问题,看到的内容全部变为了Question object,这样的表示方式,对人来说,是相当的不友好的。

所以,以上,就是我所理解的__unicode__的作用,希望对你有所帮助。

看这个 https://docs.djangoproject.co...

简单的说是Python2你使用unicode(对象)的时候 django自动调用的方法

Python3 使用 __str__

来个官方例子

from django.db import models

class Place(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=80)

    def __str__(self):              # __unicode__ on Python 2
        return "%s the place" % self.name

还可以参考这个链接 https://docs.python.org/3.3/h...


因为Python是用c实现的, 但是他有一些魔法方法暴露出来给对象重载用

你可以参考这个链接 http://pyzh.readthedocs.io/en...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏