我正在处理Django应用,但是当我尝试在管理中编辑其字段时,我的某个模型导致must be str, not NoneType
错误。
Stacktrace显示原因是我的__str__
方法,定义为:
def __str__(self):
return self.restaurant.name + " ==> Looks for " + self.container_tag + \
" with class: " + self.container_class or "[Not set]" + " , with id: " + self.container_id or "[Not set]"
以下是我的模型类中定义的字段:
container_tag = models.CharField(max_length=15)
container_class = models.CharField(max_length=25, null=True, blank=True)
container_id = models.CharField(max_length=25, null=True, blank=True)
如您所见,最后两个完全相同。当我将值输入container_class
(忽略container_id
)并保存时,一切正常。但是当我将值输入container_id
而不是container_class
时,我会得到上面的错误。
据我所知,or
运算符应该完成这项工作而只是"忽略"该字段是否为空。
为了完整起见,以下是触发错误的行:
" with class: " + self.container_class or "[Not set]" + " , with id: " + self.container_id or "[Not set]"
答案 0 :(得分:3)
添加的优先级高于or
,因此您的表达式有效:
(" with class: " + self.container_class) or "[Not set]"
这甚至不是你想要的。你需要把它写成:
" with class: " + (self.container_class or "[Not set]")
答案 1 :(得分:2)
对于这样的情况,我更喜欢字符串格式化字符串连接。
def __str__(self):
return "{restaurant} ==> Looks for {tag} with class: {cls}, with id:{container}".format(
restaurant=self.restaurant.name,
tag=self.container_tag,
cls=self.container_class or "[Not set]",
container=self.container or "[Not set]",
)
这不仅可以避免导致问题的运算符优先级问题(如@jasonharper所述),使用带有命名参数的字符串格式化还可以使非格式化字符串变得非常容易理解。