【问题标题】:Django Model returning NoneTypeDjango 模型返回 NoneType
【发布时间】:2010-10-07 20:11:05
【问题描述】:

我有一个模型产品

它有两个字段大小和颜色

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

【问题讨论】:

  • “NoneType 类型的对象”是您可以在 Python 文档中查找的内容。这是常数无。模型不是返回“NoneType”,而是返回 None,它是 NoneType 的对象。

标签: python django django-views


【解决方案1】:

NoneTypeNone 值所具有的类型。您想将第二个 sn-p 更改为

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

【讨论】:

  • 干杯,我以为我已经尝试过了。这就是我尝试测试长度的原因。呃,好吧。你在大工作中得到这个
  • 你做到了。我喜欢这个习语——它消除了一个“或”,这使代码的可读性降低,而且很容易忘记(如图所示:))
  • 请使用 "is not None" 而不是假设 None 就像 False -- 它使 if 语句非常清楚。
  • @S.Lott:在这种情况下,我认为没有任何理由专门测试 None。目的是测试 current_product.size 是否有任何内容,这比复杂的双重检查“不是无”和 len() 更清楚。
  • @Carl Meyer:没错。当您测试 None 时,"is not None" 是正确的习惯用法,但是如果您要检查列表是否既非无 并且 有内容,请将该列表用作布尔值价值。
【解决方案2】:

NoneType 是 Python 的 NULL-Type,意思是“无”、“未定义”。它只有一个值:“无”。创建新模型对象时,其属性通常初始化为None,您可以通过比较来检查:

if someobject.someattr is None:
    # Not set yet

【讨论】:

  • 称它为“未定义”有点滑稽。变量/名称已定义,但没有任何用处。
【解决方案3】:

我可以用这个错误代码示例来最好地解释 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))  

【讨论】:

    【解决方案4】:

    我不了解 Django,但我认为当您执行此操作时涉及某种 ORM:

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

    此时,您应该始终检查是否返回 None('None' 与 Java 中的 'null' 或 Lisp 中的 'nil' 相同,只是在 Python 中 'None' 是一个对象)。这通常是 ORM 将空集映射到编程语言的方式。

    编辑: 哎呀,我只看到current_product.size 那是None 而不是current_product。如前所述,我不熟悉 Django 的 ORM,但这似乎很奇怪:我希望 current_productNonesize 具有数值。

    【讨论】:

    • 其实Django会在这种情况下引发异常(Product.NotFound)。
    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多