Ich habe ein Modell (genannt MyModel
hier), wo ichDjango Abfrage Zählung falsch
MyModel.objects.filter(value__exact='').delete()
alle Objekte mit einer leeren value
löschen (value
ist ein Textfeld mit blank=True
). Allerdings scheint es mehr Gegenstände verschwinden, wenn ich dies tun, als die Zählung ich vor mit
MyModel.objects.filter(value__exact='').count()
Wenn ich leer bewertet MyOModel
Objekte mit einer Schleife zählen, mit
count = 0
for obj in MyModel.objects.iterator():
if not obj.value or obj.value.strip() == '':
count += 1
ich nur bekommen sehr wenige zusätzliche Objekte, verglichen mit der obigen Zählung.
Was kann das verursachen?
Ich habe verwandte Modelle überprüft, die auf MyModel
verweisen, wenn sie Instanzen von MyModel
ohne leere Werte kaskadieren und irgendwie löschen könnten. Das ist nicht der Fall.
Ich bin auf Django 1.8.7.
UPDATE
zum Mystizismus Ich habe jetzt Schleife in einem löschen versucht, hinzuzufügen:
count = 0
for attribute_value in AttributeValue.objects.filter(value__exact=''):
attribute_value.delete()
count += 1
Die count
Variable MyModel
Objekten mit der erwarteten Anzahl der gelöschten kommt, aber immer noch
MyModel.objects.filter(value__exact='').count()
kommt mit einer niedrigeren Anzahl als erwartet heraus. Tatsächlich scheint es, als ob mehr als dreimal so viele Objekte gelöscht wurden wie erwartet.
Ich habe versucht, auch die folgenden für die Zählung (siehe Kommentare)
MyModel.objects.filter(value='').count()
MyModel.objects.filter(value=u'').count()
mit gleichen Ergebnissen für Zählungen.
Beachten Sie, dass die von Django nach einem Löschvorgang zurückgegebene Zahl die Anzahl der Objekte ** und ** verwandter Objekte angibt, die gelöscht wurden. Vielleicht verwirrt dich das. – lucasnadalutti
Die Abfragen prüfen auf eine leere Zeichenfolge. Es entfernt nicht automatisch Leerzeichen aus dem Zeilenwert. – knbk
'wenn nicht obj.value oder obj.value.strip() == ''' Dies schließt auch Zeichenfolgen ein, die nur Leerzeichen enthalten, sowie 'None', falls das möglich ist. –