2013-01-02 11 views
11

Mam próbowali usuwać rekordy z wielu modeli w jednej metody, zostały Mam następujący schemat:Czy istnieje "właściwy" sposób konwersji django.db.models.query.ValuesListQuerySet do czystej listy?

picture 1:1 picture_foreign_picture *:1 picture_foreign 

mam Usunięcie tych danej listy obiektów picture_foreign:

picture_foreign_pictures = PictureForeignPicture.objects.filter(picture_foreign__in=picture_foreigns) 
picture_ids = picture_foreign_pictures.values_list('picture_id', flat=True) 
logger.warn('PICTURES REMOVE: %s' % picture_ids) 
picture_foreign_pictures.delete() 
logger.warn('PICTURES REMOVE: %s' % picture_ids) 

W 2 wywożący linie wyjściowe następujące:

WARNING 2013-01-02 03:40:10,974 PICTURES REMOVE: [86L] 
WARNING 2013-01-02 03:40:11,045 PICTURES REMOVE: [] 

Mimo to jednak obraz 86 nadal istnieje:

mysql> select id from picture where id = 86; 
+----+ 
| id | 
+----+ 
| 86 | 
+----+ 
1 row in set (0.00 sec) 

Chyba mogę obejść ten problem, po prostu konwersja picture_ids do czystego listy całkowitej jednak zastanawiam się, czy istnieje bardziej metoda Django do tego? Pomyślałbym, że flat=True poradziłby sobie z tym, ale wydaje się być czymś więcej niż czystą listą.

Odpowiedz

26

Cóż, nie jestem pewien, że to właściwe, ale to śmiesznie proste w użyciu list() do osiągnięcia tego celu:

picture_ids = list(picture_foreign_pictures.values_list('picture_id', flat=True)) 
+5

powyżej działania jest podnoszenie błąd: błąd w argumencie: – Arun

+1

@Arun dostałem '*** błąd w argument' błędu kiedy debugowania z WPB, ponieważ pdb zastępuje słowo kluczowe 'list'. W * świecie rzeczywistym * to rozwiązanie działa. –

+0

Dotknie bazy danych do przekonwertowania. Jest to problem, ponieważ jeśli ValueListQuerySet jest podzapytaniem innego zapytania, dotknie bazy danych, zanim będzie to konieczne. –

4

Przede rozwiązanie nie działa:

można przekonwertować do listy pur jak ta :

p_ids =PictureForeignPicture.objects.filter(picture_foreign__in=picture_foreigns).values_list('picture_id', flat=True) 

new_list = [];new_list.extend(p_ids) 
+0

Jakiego pythona/django używasz? Myślę, że moje rozwiązanie było na Pythonie 2.7/Django 1.4? – DanH

Powiązane problemy