2013-10-03 56 views
1

我有一個名爲關鍵字一個簡單的模型:Django的:model.objects.create()改變了以往model.objects.filter()的結果集

class Keyword(models.Model): 
    name = models.CharField(max_length=50, blank=False, null=False) 

我試圖做bulk_create,但批量數據可能包含已有的關鍵字,因此我分兩步進行操作。首先獲取現有的關鍵字,然後bulk_create新的關鍵字。以下是我在這個過程中做了一個小例子:

In [12]: t = ["aaaa", "dene"] 

In [16]: existing = Keyword.objects.filter(name__in=t).all() 

In [17]: new = set(t).difference(list(existing.values_list("name", flat=True)))         

In [18]: new 
Out[18]: {'aaaa'} 

In [19]: existing 
Out[19]: [<Keyword: dene>] 

In [20]: created = Keyword.objects.bulk_create([Keyword(name=name) for name in new])       

In [21]: created 
Out[21]: [<Keyword: aaaa>] 

In [22]: existing 
Out[22]: [<Keyword: aaaa>, <Keyword: dene>] 

兩個bulk_create和創建更新以前的過濾器的結果集。這很可能是一個錯誤,但我也可能在這裏錯過了一些觀點。我的實施有什麼問題嗎?

Django版本是1.5.3。

+0

所以問題是,現有的顯示2結果而不是1?它似乎是重新評估過濾器。 – jproffitt

回答

2

當實際檢索值時,Django查詢集會被懶惰地評估。如果你想保持相同的模型序列,那麼你需要將它們傳遞給list構造函數爲了鞏固它們。

existinglist = list(existing) 
+0

啊我不好。我認爲[17]中的existing.values_list已經在評估查詢集。謝謝。 – hinoglu

+0

@hinoglu:是的。但之後它再次得到評估19,然後在22。 –

+0

混淆然後。我可能已經失去了django's orm和評估細節的軌道。 IIRC django沒有重新評估結果集,如果它已經被評估過,並且使用了評估的價值,那麼這似乎是完全錯誤的? – hinoglu