2016-11-23 5 views
2

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

Löschen erhalten
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.

+2

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

+1

Die Abfragen prüfen auf eine leere Zeichenfolge. Es entfernt nicht automatisch Leerzeichen aus dem Zeilenwert. – knbk

+0

'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. –

Antwort

0

Dies wird Ihr Problem

from django.db.models.functions import Length 

Um alle Wertefelder, die

etwas enthalten sortieren
MyModel.objects.annotate(value_length=Length('value')).filter(value_length=0) 

alle Werte zu erhalten, die

MyModel.objects.annotate nicht null sind (Wert_Länge = Länge ('Wert')) Filter (Wert_Länge__gt = 0)

Y ou kann auch auf diese Weise tun

MyModel.objects.filter(value='',value__isnull=True) 
+0

Ihre erste Option scheint zu kompliziert. In Bezug auf Ihre zweite Option ist "Wert" nicht nullbar und Sie müssen 'Q' Objekte verwenden, um ein logisches' oder' auszugeben. – beruic

0

ich den Täter in einem anderen Modell mit einem unbemerkt fremd MyModel gefunden. Der Grund, warum ich nicht nachgesehen habe, war, dass dieses Modell in meinem Setup auch Referenzen von MyModel ist, und PyCharm hat die Beziehung irgendwie verpasst (oder ich habe es in der PyCharm GUI gemacht).Die neue Version von PyCharm, die gerade kam, hat es jetzt für mich repariert.

Sorry für die Verwirrung.