Django:为什么__ unicode__在print(some_model_instance)期间没有运行?

时间:2010-01-18 22:16:05

标签: django django-models

这是我的班级:

class Account(models.Model):

    name = models.CharField(max_length=255)

    def __unicode__(self):
        return '{0}'.format(self.name)

class Painting(models.Model):

    account = models.ForeignKey(Account)
    color = models.CharField(max_length=255)

    def __unicode__(self):
        return 'Account: {0} - Color: {1}'.format(self.account, self.color)

这是我的shell:

>>> from somewhere import Account, Painting
>>> acct = Account(name='Acme')
>>> acct.save()
>>> ptng = Painting(account=acct, color='FF0000')
>>> ptng.save()
>>> print(ptng)
FF0000
>>> 
>>> # Make another instance for next demonstration:
>>> 
>>> ptng_2 = Painting(account=acct, color='CC0000')
>>> ptng_2.save()
>>> 
>>> # Check for 'FF0000' in all the objects:
>>> 
>>> allptngs = Painting.objects.filter(account=acct)
>>> 'FF0000' in allptngs
False
>>> for p in allptngs:
>>>     print(p)
...
...
FF0000
CC0000
>>> 
>>> # Now with unicode():
>>> 
>>> for p in allptngs:
>>>     unicode(p)
...
...
u'FF0000'
u'CC0000'

请注意,打印时Painting对象不会通过__unicode__方法输出,而是打印color属性。这是为什么?

然后请注意,当我询问'FF0000'是否在allptngs中时,它会返回false,但如果我循环遍历allptngs并打印每个'FF0000',那么unicode(object)确实在迭代。这非常令人困惑。

更新:我忘了提及print(object)在上面的示例中返回与{{1}}相同的内容。

1 个答案:

答案 0 :(得分:4)

  

注意如何在打印时不通过 unicode 方法输出绘图对象,而是打印颜色属性。这是为什么?

print(x)来电x.__str__(),而非x.__unicode__()。 Django努力使用unicode字符串来表示事物,因此在需要渲染对象的文本表示的许多重要地方,它默认使用x.__unicode__()。但是您使用的是内置python命令,该命令始终调用x.__str__()

  

然后注意,当我询问'FF0000'是否在allptngs中时,它返回false,但是如果我遍历allptng并打印每个,'FF0000'确实在迭代中。这非常令人困惑。

这完全一致。 a in b验证a中的b是否等于 a中的任何元素。这与b等于def __str__(self): return self.__unicode__() 的某个元素的字符串表示不同。

我的建议是添加到您的模型中:

{{1}}