2009-02-16 64 views
2

我有一个模型产品Django模块返回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?我该如何测试它?

+2

“类型为NoneType的对象”是您可以在Python文档中查找的东西。这是不变的无。该模型不返回“NoneType”,它返回None,它是NoneType的一个对象。 – 2009-02-16 11:17:36

回答

7

NoneTypeNone值的类型。您想将第二个片段更改为

if current_product.size: # This will evaluate as false if size is None or len(size) == 0. 
    blah blah 
+0

干杯, 我以为我试过。这就是我试图测试长度的原因。呃,好吧。你在大工作上得到这个 – 2009-02-16 07:52:52

+0

你这样做。我喜欢这个成语 - 它消除了使得代码更不可读的“或”,并且这很容易被忽略(如图所示:)) – ruds 2009-02-16 08:30:25

+0

请使用“不是无”而不是假设无是假 - 它使if语句完全清晰。 – 2009-02-16 11:10:41

1

NoneType是Pythons NULL-Type,意思是“nothing”,“undefined”。它只有一个值:“无”。当创建一个新的模型对象,它的属性通常被初始化为None,您可以检查通过比较:

if someobject.someattr is None: 
    # Not set yet 
-1

我不知道Django的,但我认为某种ORM的参与,当你做到这一点:

current_product = Product.objects.get(slug=title) 

此时,您应经常检查你是否获得无回(“无”是相同的Java“空”或Lisp的“零”与微妙的区别在于“无”是一个对象在Python中)。这通常是ORM将空集映射到编程语言的方式。

编辑: 哎呀,我只看到它的current_product.sizeNonecurrent_product。如上所述,我并不熟悉Django的ORM,但是这看起来很奇怪:我期望current_productNonesize有数字值。

0

我能与最好的错误代码,这个例子说明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))