urls example documentacion based python django django-views

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))