Модель Django возвращает NoneType
-
23-08-2019 - |
Вопрос
У меня есть модель продукта
среди прочего есть два поля размера и цвета
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
это тип, который None
значение имеет.Вы хотите изменить второй фрагмент на
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
Другие советы
NoneType — это NULL-тип Python, что означает «ничего», «неопределенное».Он имеет только одно значение:"Никто".При создании нового объекта модели его атрибуты обычно инициализируются как None, это можно проверить, сравнив:
if someobject.someattr is None:
# Not set yet
Лучше всего я могу объяснить ошибку 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))
Я не знаю Django, но предполагаю, что при этом задействован какой-то ORM:
current_product = Product.objects.get(slug=title)
На этом этапе вам всегда следует проверять, получаете ли вы обратно None («None» — то же самое, что «null» в Java или «nil» в Lisp, с той небольшой разницей, что «None» — это объект в Python).Обычно именно так ORM отображает пустой набор на языке программирования.
РЕДАКТИРОВАТЬ:Ну и дела, я просто вижу, что это current_product.size
это None
нет current_product
.Как уже было сказано, я не знаком с ORM Django, но, тем не менее, это кажется странным:Я бы либо ожидал current_product
быть None
или size
имеющий числовое значение.