这是我的班级:
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}}相同的内容。
答案 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}}