Django Modèle NoneType retour
-
23-08-2019 - |
Question
J'ai un modèle produit
il a entre autres deux champs taille et les couleurs
colours = models.CharField(blank=True, null=True, max_length=500)
size = models.CharField(blank=True, null=True, max_length=500)
À mon avis, j'ai
current_product = Product.objects.get(slug=title)
if len(current_product.size) != 0 :
current_product.size = current_product.size.split(",")
et obtenir cette erreur:
objet de type 'NoneType' n'a pas len ()
Qu'est-ce que NoneType et comment puis-je tester pour cela?
La solution
NoneType
est le type que la valeur de None
a. Vous voulez changer le deuxième extrait à
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
Autres conseils
NoneType est Pythons NULL-type, ce qui signifie "rien", "non défini". Il n'a qu'une seule valeur: « Aucun ». Lors de la création d'un nouvel objet modèle, ses attributs sont généralement initialisés à Aucun, vous pouvez vérifier que en comparant:
if someobject.someattr is None:
# Not set yet
Je peux mieux expliquer l'erreur de NoneType avec cet exemple de code erroné:
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))
retourne s.remove()
rien aussi connu sous le nom NoneType. La manière correcte
def test2()
s = list([1,'',2,3,4,'',5])
try:
s.remove('') # <-- CORRECTED
except:
pass
print(str(s))
Je ne sais pas Django, mais je suppose que certains types de ORM est impliqué quand vous faites ceci:
current_product = Product.objects.get(slug=title)
A ce moment-là, vous devriez toujours vérifier si vous obtenez Aucun retour ( « None » est la même chose que « nul » en Java ou « nul » en Lisp avec la différence subtile que « Aucun » est un objet en Python). Ce sont généralement les ORM façon carte l'ensemble vide au langage de programmation.
EDIT:
Gee, je vois juste qu'il est current_product.size
qui est None
pas current_product
. Comme l'a dit, je ne suis pas familier avec l'ORM de Django, mais cela semble étrange quand même: je soit attendre current_product
à None
ou size
ayant une valeur numérique