Модель Джанго, возвращающая NoneType - PullRequest
2 голосов
/ 16 февраля 2009

У меня есть модель товара

имеет два поля размера и цвета среди других

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 и как я могу его протестировать?

Ответы [ 4 ]

8 голосов
/ 16 февраля 2009

NoneType - это тип, который имеет значение None. Вы хотите изменить второй фрагмент на

if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
  blah blah
1 голос
/ 16 февраля 2009

NoneType - это Pythons NULL-Type, что означает «ничего», «неопределено». Он имеет только одно значение: «Нет». При создании нового объекта модели его атрибуты обычно инициализируются как None, это можно проверить, сравнив:

if someobject.someattr is None:
    # Not set yet
0 голосов
/ 14 декабря 2009

Я могу лучше всего объяснить ошибку 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))  
0 голосов
/ 16 февраля 2009

Я не знаю Django, но я предполагаю, что когда вы делаете это, подразумевается что-то вроде ORM:

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

В этот момент вы всегда должны проверять, получаете ли вы обратно None («None» - это то же самое, что «NULL» в Java или «NIL» в Lisp, с небольшой разницей, что «None» является объектом в Python). Обычно ORM отображают пустой набор на язык программирования.

EDIT: Ну и дела, я просто вижу, что это current_product.size это None не current_product. Как я уже сказал, я не знаком с ORM Джанго, но, тем не менее, это кажется странным: я бы ожидал, что current_product будет None или size с числовым значением.

...