2009-04-13 17 views
6

我通過做幾個查詢來構建一個Django模型對象的列表。然後我想刪除任何重複項(所有這些對象與auto_increment int PK都是相同的類型),但我不能使用set(),因爲它們不可哈希。Django模型 - 如何在事實之後通過PK過濾出重複值?

有沒有一個快速簡單的方法來做到這一點?我正在考慮使用一個字典而不是以id爲關鍵字的列表。

回答

6

有沒有一個快速簡單的方法來做到這一點?我正在考慮使用一個字典而不是以id爲關鍵字的列表。

這正是我要做的,如果你被鎖定在你當前的幾個查詢結構中。然後,一個簡單的dictionary.values()將返回您的列表。

如果你有更多的靈活性,爲什麼不使用Q對象?不是實際進行查詢,而是將每個查詢存儲在一個Q對象中,並使用按位或(「|」)來執行單個查詢。這將實現您的目標並保存數據庫匹配。

Django Q objects

+0

這是你將如何你搶的對象時,外鍵ID是從多個表來(有點像IN詢問由多部分組成)? – wsorenson 2009-04-13 16:32:17

+0

真的不那麼確定你的意思。我不知道你是如何需要它,或外鍵ID是指什麼。 – 2009-04-13 17:07:55

0

如果訂單無關緊要,請使用字典。

3

您可以使用一組如果添加__hash__函數模型的定義,以便它返回的ID(假設這不符合你可能在你的應用程序中的其他散列行爲干擾):

class MyModel(models.Model): 

    def __hash__(self): 
     return self.pk 
0

刪除「重複」取決於您如何定義「重複」。

如果你想讓每一列(PK除外)匹配,這是一個痛苦的脖子 - 這是很多比較。

另一方面,如果您有一些「自然鍵」列(或短的一組列),則可以輕鬆查詢和刪除這些列。

master = MyModel.objects.get(id=theMasterKey) 
dups = MyModel.objects.filter(fld1=master.fld1, fld2=master.fld2) 
dups.all().delete() 

如果你可以識別一些較短的重複識別關鍵字段,這個工作很好。


編輯

如果模型對象沒有被保存到數據庫中,則可以使這些鍵的元組的字典。

unique = {} 
... 
key = (anObject.fld1,anObject.fld2) 
if key not in unique: 
    unique[key]= anObject 
12

一般來說,如果可能的話,最好將所有查詢合併到一個查詢中。 IE瀏覽器。的

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)) 

代替

q1 = Models.object.filter(field1=f1) 
q2 = Models.object.filter(field2=f2) 

如果第一次查詢返回的複製模型,然後使用不同的()

q = Model.objects.filter(Q(field1=f1)|Q(field2=f2)).distinct() 

如果查詢真的是不可能用一個命令來執行,然後你必須訴諸使用其他答案中推薦的字典或其他技術。如果您在SO上發佈確切的查詢,並且可以查看是否可以合併爲單個查詢,可能會有所幫助。根據我的經驗,大多數查詢可以使用單個查詢集完成。

0

我用這一個:

dict(zip(map(lambda x: x.pk,items),items)).values()