提问人:Cato Johnston 提问时间:2/16/2009 更新时间:5/25/2012 访问量:14173
Django 模型返回 NoneType
Django Model returning NoneType
问:
我有一个模型产品
它有两个字段:大小和颜色等
colours = models.CharField(blank=True, null=True, max_length=500)
size = models.CharField(blank=True, null=True, max_length=500)
在我看来,我有
current_product = Product.objects.get(slug=title)
if len(current_product.size) != 0 :
current_product.size = current_product.size.split(",")
并收到此错误:
类型为“NoneType”的对象没有 len()
什么是 NoneType,如何测试它?
答:
8赞
ruds
2/16/2009
#1
NoneType
是值所具有的类型。您希望将第二个代码段更改为None
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
评论
0赞
Cato Johnston
2/16/2009
干杯,我以为我已经试过了。这就是我尝试测试长度的原因。嗯,好吧。你在大工作中得到这个
0赞
ruds
2/16/2009
你就是这样做的。我喜欢这个成语——它消除了使代码可读性降低的“或”,而且很容易忘记(如图所示 :) )
0赞
S.Lott
2/16/2009
请使用 “is not None” 而不是假设 None 像 False 一样 -- 它使 if 语句非常清楚。
0赞
Carl Meyer
2/16/2009
@S.Lott:我看不出有什么理由在这种情况下专门测试 None。目的是测试 current_product.size 是否包含任何内容,这比对 “is not None” 和 len() 进行复杂的双重检查更清楚。
0赞
ruds
2/17/2009
@Carl Meyer:没错。“is not None”是测试 None 时的正确用语,但如果要检查列表是否既是非 None 又有内容,请使用该列表作为布尔值。
1赞
Ferdinand Beyer
2/16/2009
#2
NoneType 是 Python 的 NULL-Type,意思是“什么都没有”、“未定义”。它只有一个值:“None”。创建新的模型对象时,其属性通常初始化为 None,您可以通过比较以下方法进行检查:
if someobject.someattr is None:
# Not set yet
评论
0赞
Ignacio Vazquez-Abrams
2/16/2009
称其为“未定义”有点面子。变量/名称已定义,但它没有有用的值。
-1赞
paprika
2/16/2009
#3
我不了解 Django,但我认为当你这样做时会涉及某种 ORM:
current_product = Product.objects.get(slug=title)
在这一点上,你应该始终检查你是否得到了None('None'与Java中的'null'或Lisp中的'nil'相同,但'None'是Python中的对象)的细微区别)。这通常是 ORM 将空集映射到编程语言的方式。
编辑:哎呀,我只是看到不是.如前所述,我不熟悉 Django 的 ORM,但这看起来很奇怪:我要么期望是,要么有一个数值。current_product.size
None
current_product
current_product
None
size
评论
0赞
Ferdinand Beyer
2/16/2009
事实上,在这种情况下,Django 会引发一个异常 (Product.NotFound)。
0赞
baudsmoke
12/14/2009
#4
我可以用这个错误代码的例子来最好地解释NoneType错误:
def test():
s = list([1,'',2,3,4,'',5])
try:
s = s.remove('') # <-- THIS WRONG because it turns s in to a NoneType
except:
pass
print(str(s))
s.remove()
不返回任何内容,也称为 NoneType。正确的方式
def test2()
s = list([1,'',2,3,4,'',5])
try:
s.remove('') # <-- CORRECTED
except:
pass
print(str(s))
上一个:如何根据另一个字段填充字段
下一个:是否可以将数据库名称作为参数传递
评论