2013-01-02 69 views
11

我試圖刪除在一個單一的方法從衆多的車型記錄,是我有以下模式:有沒有「正確的」方法將django.db.models.query.ValuesListQuerySet轉換爲純List?

picture 1:1 picture_foreign_picture *:1 picture_foreign 

我刪除這些定列表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) 

所述記錄器2條輸出線執行以下操作:

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

儘管如此然而,畫面86仍然存在:

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

我想我可以解決這個問題通過簡單的轉換picture_ids成純整數列表,但是我不知道是否有一個更Django的方法呢?我本以爲flat=True已經可以處理這個,但它似乎不僅僅是一個純粹的列表。

回答

26

好了,我不知道這是正確的,但它是可笑的簡單使用list()來實現:

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

上述操作引發錯誤 – Arun

+1

@Arun我得到了'***錯誤argument'錯誤,當我與PDB調試,因爲pdb覆蓋關鍵字'list'。在*真實世界*中,此解決方案有效。 –

+0

它會觸摸數據庫進行轉換。這是一個問題,因爲如果ValueListQuerySet是另一個查詢的子查詢,它將在需要之前觸摸數據庫。 –

4

上述解決方案是行不通的:

可以轉換爲這樣的PUR列表:在參數錯誤:

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

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

你使用了什麼python/django?我認爲我的解決方案是在Python 2.7/Django 1.4上? – DanH

相關問題