2017-09-01 54 views
0

我正在寫一個django應用程序,我創建一個模型對象,然後在最後批量創建數據。這裏是我的代碼:如何檢查在Django的緩存查詢列中是否存在值?

date_list = [list of dates] 
data = [] 
for date in date_list: 
    my_row = Model1.objects.get(date=date) 
    if not date in data: 
     data.append(Model2(user_id=my_row.user_id, date = date)) 
Model2.objects.bulk_create(data) 

這是錯誤的是:

[ Model2(date = date), Model2(date = date), Model2(date = date),..] 

任何建議:if not date in data:如何在它看起來像一個列表中搜索對象與我date

+0

所以你不想添加一個重複日期的Model2,是嗎?你能否預先刪除重複的日期? – wholevinski

+0

不,這個問題的重點在於檢查日期是否存在於數據列表中。 – Elisha512

+1

您應該移動在循環外部添加的'my_row = Model1.objects.get(country ='GB')',以便它不會觸發N個查詢。 – wholevinski

回答

2

你不能指望找到的Model2列表的date - 他們是不一樣的物體。將q & d的解決辦法是使用另一個容器來存儲和查找的日期已經作用似乎 - 優選set()因爲容納測試快得多(O(1),而不是O(N)):

date_list = [list of dates] 
data = [] 
date_seens = set() 
for date in date_list: 
    if date not in date_seens: 
     data.append(Model2(date=date)) 
     date_seens.add(date) 

但然後,因爲我們的目標是不是給定日期創建多個Model2情況下,更有效的是讓date_list本身set,這將garantee日期的唯一身份,從一開始:

data = [Model2(date=date) for date in set(date_list)] 

注意這最後的解決方案不會保留date_list命令,但我認爲這不重要。

另外請注意,這些都不能garantee你沒有在模型中的表中的重複日期 - 我們重複數據刪除的日期從date_list,但如果你用相同的日期運行相同的腳本兩次你有(至少)每個日期有兩個不同的Model2行。如果要強制模型的唯一性,則必須在數據庫級別執行此操作(對模型的date字段使用unique=True約束),但如果其中一個日期已在數據庫中,則bulk_create將失敗...

1

你能用set嗎?

date_list = [list of dates] 
for date in set(date_list): 
    data.append(Model2(date = date)) 
Model2.objects.bulk_create(data) 
+0

不,這個問題的重點在於檢查日期是否存在於數據列表中。 – Elisha512

相關問題