Django 模型返回 NoneType

Django Model returning NoneType

提问人:Cato Johnston 提问时间:2/16/2009 更新时间:5/25/2012 访问量:14173

问:

我有一个模型产品

它有两个字段:大小和颜色等

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,如何测试它?

python django django-views

评论

2赞 S.Lott 2/16/2009
“NoneType 类型的对象”是您可以在 Python 文档中查找的内容。这是不变的 None。该模型不返回“NoneType”,而是返回 None,它是 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.sizeNonecurrent_productcurrent_productNonesize

评论

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))