Modelo Django que devuelve Ninguno Tipo
-
23-08-2019 - |
Pregunta
Tengo un producto modelo
tiene dos campos tamaño 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 obtiene este error:
objeto de tipo 'NoneType' no tiene len()
¿Qué es NoneType y cómo puedo probarlo?
Solución
NoneType
es el tipo que el valor None
tiene. ¿Quieres cambiar el segundo fragmento a
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
Otros consejos
NoneType es pitones NULL-Type, que significa "nada", "indefinido". Sólo tiene un valor de: "Ninguno". Al crear un nuevo modelo de objetos, sus atributos son generalmente inicializan en Ninguno, se puede comprobar que mediante la comparación:
if someobject.someattr is None:
# Not set yet
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 manera correcta
def test2()
s = list([1,'',2,3,4,'',5])
try:
s.remove('') # <-- CORRECTED
except:
pass
print(str(s))
No sé Django, pero supongo que algún tipo de ORM está involucrado al hacer esto:
current_product = Product.objects.get(slug=title)
En ese momento siempre se debe comprobar si se obtiene Ninguna parte de atrás ( 'Nada' es lo mismo que 'nulo' en Java o las negativas en Lisp con la diferencia sutil que 'Ninguno' es un objeto en Python). Esta suele ser la forma ORM mapa el conjunto vacío al lenguaje de programación.
EDIT:
Vaya, acabo de ver que es current_product.size
que es None
no current_product
. Como se ha dicho, no estoy familiarizado con ORM de Django, pero esto parece extraño, sin embargo: Yo tampoco esperaba current_product
que se None
o size
tener un valor numérico