python - example - Modelo Django regresa NoneType
render django (4)
Tengo un producto modelo
tiene dos tamaños de campo y colores entre otros
colours = models.CharField(blank=True, null=True, max_length=500)
size = models.CharField(blank=True, null=True, max_length=500)
En mi opinión, tengo
current_product = Product.objects.get(slug=title)
if len(current_product.size) != 0 :
current_product.size = current_product.size.split(",")
y consigue este error:
objeto de tipo ''NoneType'' no tiene len ()
¿Qué es NoneType y cómo puedo probarlo?
No conozco a Django, pero supongo que algún tipo de ORM está involucrado cuando haces esto:
current_product = Product.objects.get(slug=title)
En ese punto, siempre debes comprobar si obtienes Ninguno (''Ninguno'' es lo mismo que ''nulo'' en Java o ''nulo'' en Lisp con la sutil diferencia de que ''Ninguno'' es un objeto en Python). Esta es generalmente la forma en que los ORM asignan el conjunto vacío al lenguaje de programación.
EDIT: Gee, acabo de ver que es current_product.size
que es None
no current_product
. Como dije, no estoy familiarizado con el ORM de Django, pero esto parece extraño, sin embargo: esperaría que current_product
sea None
o que el size
tenga un valor numérico.
NoneType es Pythons NULL-Type, que significa "nada", "indefinido". Tiene un solo valor: "Ninguno". Al crear un nuevo objeto modelo, sus atributos generalmente se inicializan en Ninguno, puede verificarlo comparando:
if someobject.someattr is None:
# Not set yet
NoneType
es el tipo que tiene el valor None
. Desea cambiar el segundo fragmento a
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
Puedo explicar mejor el error NoneType con este ejemplo de código erróneo:
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()
no devuelve nada también conocido como NoneType. La forma correcta
def test2()
s = list([1,'''',2,3,4,'''',5])
try:
s.remove('''') # <-- CORRECTED
except:
pass
print(str(s))