2013-08-20 114 views
0

一個場在我的模型是一個charField與格式substring1-substring2-substring3-substring4,它可以在此範圍值:我需要統計Django的查詢集計算子在charField

"1-1-2-1" 
"1-1-2-2" 
"1-1-2-3" 
"1-1-2-4" 
"2-2-2-6" 
"2-2-2-7" 
"2-2-2-9" 
"3-1-1-10" 
"10-1-1-11" 
"11-1-1-12" 
"11-1-1-13" 

例如substring1的單次出現次數。 在這種情況下,有5個獨特的事件(1,2,3,10,11)。

"1-X-X-X" 
"2-X-X-X" 
"3-X-X-X" 
"10-X-X-X" 
"11-X-X-XX" 

真誠地,我不知道我可以從哪裏開始。我閱讀了文檔https://docs.djangoproject.com/en/1.5/ref/models/querysets/,但我沒有找到具體的線索。

在此先感謝。

+0

你能解釋一下好嗎?從你的例子中,'子串1'(根據你的規則,是數字'1')出現4次(1,2,3和4項),所以我真的不知道你有5和與那些職位 –

+0

對不起!我只是修改它。我的意思是計算作爲charfield的第一部分(例如NN-)的substring1的唯一出現次數。 在這種情況下,有5個唯一的事件1,2,3,10,11 – Daviddd

+0

好吧,現在我明白你的問題了,你想爲你的字符串的第一個子字符串計算唯一的外觀。現在它是有道理:) –

回答

1
results = MyModel.objects.all() 

pos_id = 0 

values_for_pos_id = [res.field_to_check.split('-')[pos_id] for res in results] 
values_for_pos_id = set(values_for_pos_id) 

這是如何工作的:

  • 首先你抓取所有對象(results
  • pos_id是你的子指數(你有4子,因此它在範圍0〜3)
  • 你在-(你的分隔符)上分割了每個field_to_check(又名:你在哪裏存儲子串組合)並獲取該對象的正確子串
  • 你的列表轉換爲一組(將所有的唯一值)

那麼簡單len(values_for_pos_id)會做的伎倆爲

您注意:如果你沒有pos_id或根本不能將它設置在任何地方,你只需要像這樣循環:

for pos_id in range(4): 
    values_for_pos_id = set([res.field_to_check.split('-')[pos_id] for res in results]) 
    # process your set results now 
    print len(values_for_pos_id) 
+0

只需最好(cit。)! 感謝您的代碼解釋! – Daviddd

0

嘗試這樣的事情...

# Assumes your model name is NumberStrings and attribute numbers stores the string. 
search_string = "1-1-2-1" 
matched_number_strings = NumberStrings.objects.filter(numbers__contains=search_string) 
num_of_occurrences = len(matches_found) 
matched_ids = [match.id for match in matched_number_strings] 
+0

對不起,我的問題不清楚。我沒有輸入搜索字符串。我需要計算substring1的所有唯一出現次數。看到我修改後的問題。 – Daviddd

0

,你可以通過這些項目(我猜他們是字符串),並且每個substring_ ñ的價值添加到SET_ ñ循環。

由於設定值是唯一的,因此您將擁有一個名爲Set_1的集合,例如包含1,2,3,10,11。

有意義嗎?