Django Modell Rückkehr NoneType
-
23-08-2019 - |
Frage
Ich habe ein Modell Artikel
es hat zwei Felder Größe und Farben unter anderem
colours = models.CharField(blank=True, null=True, max_length=500)
size = models.CharField(blank=True, null=True, max_length=500)
Aus meiner Sicht habe ich
current_product = Product.objects.get(slug=title)
if len(current_product.size) != 0 :
current_product.size = current_product.size.split(",")
und diesen Fehler:
Objekt vom Typ 'NoneType' hat keine len ()
Was ist NoneType und wie kann ich testen, es?
Lösung
NoneType
ist der Typ, der None
Wert hat. Sie wollen den zweiten Code-Schnipsel ändern
if current_product.size: # This will evaluate as false if size is None or len(size) == 0.
blah blah
Andere Tipps
NoneType ist Pythons NULL-Typ, "nichts", "unbestimmt" bedeutet. Es hat nur einen Wert: „Keine“. Wenn ein neues Modell-Objekt erstellen, werden seine Attribute in der Regel auf None initialisiert, können Sie, dass durch den Vergleich überprüfen:
if someobject.someattr is None:
# Not set yet
Ich kann am besten erklärt die NoneType Fehler bei diesem Beispiel eines fehlerhaften Code:
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()
kehrt nichts auch als NoneType bekannt. Der richtige Weg
def test2()
s = list([1,'',2,3,4,'',5])
try:
s.remove('') # <-- CORRECTED
except:
pass
print(str(s))
Ich weiß nicht, Django, aber ich nehme an, dass irgendeine Art von ORM beteiligt ist, wenn Sie dies tun:
current_product = Product.objects.get(slug=title)
An diesem Punkt sollten Sie immer überprüfen, ob Sie None zurück ( ‚None‘ ist das gleiche wie ‚null‘ in Java oder ‚Null‘ in Lisp mit dem feinen Unterschied, dass ‚None‘ ist ein Objekt in Python). Dies ist in der Regel die Art und Weise ORMs die leere Menge in die Programmiersprache abzubilden.
EDIT:
Gee, ich sehe gerade, dass es current_product.size
ist die None
nicht current_product
ist. Wie gesagt, ich bin mit Django ORM nicht vertraut, aber diese dennoch seltsam scheint: Ich würde entweder erwarten current_product
einen numerischen Wert None
oder size
mit zu