2013-05-09 16 views
7

Zastanawiam się, jaki jest najlepszy sposób na iterowanie w Django QuerySet podczas usuwania obiektów w kwerendzie? Załóżmy na przykład, że masz tabelę dziennika z wpisami o określonych porach i chcesz je zarchiwizować, tak aby nie było więcej niż 1 wpisu co 5 minut. Wiem, że to może być źle, ale to niby co ja jadę dla:Iterowanie przez Django QuerySet podczas usuwania obiektów w tym samym QuerySet

toarchive = Log.objects.all().order_by("-date") 
start = toarchive[0].date 
interval = start - datetime.timedelta(minutes=5) 
for entry in toarchive[1:]:   
    if entry.date > interval: 
     entry.delete() 
    else: 
     interval = entry.date - datetime.timedelta(minutes=5) 
+3

To jest poprawne, możesz usunąć obiekty w ten sposób. – Rohan

+0

Używając delete() podczas zapętlania tego typu zestawów, zachowaj pusty reccord po przejściu na stronę administratora modelu. Wygląda na to, że obiekt nie został całkowicie usunięty. Co jest nie tak? –

Odpowiedz

0

querysets mają delete metodę, która usuwa wszystkie wyniki tego queryset. Na przykład podałeś, że zadziałasz. Jeśli jednak wykonujesz test, którego nie można wykonać w filtrze, prawdopodobnie opisana metoda jest najlepsza.

+0

Dzięki za odpowiedź! Wiem, że ta metoda jest również możliwa. Jednak w tym przypadku nie sądzę, że będzie działać, ponieważ warunek usuwania jest względny między wpisami w kwerendy. Domyślam się, co chcę wiedzieć bardziej ogólnie, czy napotkam problemy, jeśli usuwam obiekty z QuerySet, podczas gdy ja iteruję przez to. – user1630866

+0

Masz rację, nie zwracałem uwagi na klauzulę "else". Nie testowałem tego, ale usuwanie obiektów w QuerySet powinno być bezpieczne, ponieważ 'delete' powoduje jedynie kwerendę usuwania SQL, nie wpływa to na obiekt modelu w pamięci. – Will

+0

to zniszczy wpis do bazy danych? lub po prostu usunąć go z kwerendy? – jeff

3

Sądzę, że odpowiedziałem na własne pytanie, pytając, czy ktoś jeszcze jest ciekawy. Myślałem, że byłby problem podczas usuwania obiektów podczas iteracji nad nimi, ale nie ma. Fragment kodu w pytaniu to odpowiednia metoda.

+1

Jak mogę usunąć element z zestawu zapytań zamiast usuwania obiektu po wykonaniu operacji filtru? –

Powiązane problemy