2010-06-15 61 views
9

我有一組Django模型的如下面的圖中(反向關係的名稱顯示在黃色氣泡):如何過濾這些Django記錄?

Django models http://mipadi.cbstaff.com/images/misc/people_django.jpg

在每個關係,一個Person可以具有0個或多個的項目。

此外,slug字段(不幸)不是唯一的;多個Person記錄可能具有相同的slug字段。基本上這些記錄是重複的。

我想獲得的符合下列條件的所有記錄的列表:所有重複記錄(即具有相同蛞蝓)與至少一個Entry或至少一個Audio或至少一個Episode或至少一個Article

到目前爲止,我有以下查詢:

Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1) 

該組中的所有記錄由slug,然後添加一個num_records屬性,說多條記錄怎麼有刺蛾,但不進行額外的濾波(和我甚至不知道這是否能正常工作,因爲給定一組重複的記錄,可能有,例如和Entry,另一個可能有Article)。

簡而言之,我想查找所有重複記錄,並將它們及其關聯模型合併爲一條記錄。

用Django做這件事的最好方法是什麼?

+7

對於Django顏色的類圖,使用+1! – 2010-06-15 19:53:37

回答

1

我會在幾個查詢做到這一點。第一個是你的副本列表,您有:

dupes = [p['slug'] for p in Person.objects.values('slug').annotate(num_records=Count('slug')).filter(num_records__gt=1)] 

然後,我會遍歷這些,併爲每一個決定其保留(亂作決定 - 選擇第一個)。然後,對於所有其他主鍵,只需將所有其他對象更新爲指向所選主鍵:

for slug in dupes: 
    pks = [p.id for p in Person.objects.filter(slug=slug)] 
    for pk in pks[1:]: 
     Audio.objects.filter(person=pk).update(person=pks[0]) 
     Author.objects.filter(person=pk).update(person=pks[0]) 
     Episode.objects.filter(person=pk).update(person=pks[0]) 
     Entry.objects.filter(person=pk).update(person=pks[0]) 
+0

接受此爲答案。幾天前我解決了這個問題,但最終大致上按照你的建議做了。 – mipadi 2010-06-24 15:46:47

0

我不知道該鏈接過濾器將會把你帶到你想去的地方,因爲那裏將是具有兩種或更多種與他們的名字就文物的人的條目。看看以前的StackOverflow問題及其答案,我認爲這會幫助你把四個查詢到一個單一的QuerySet在你想要的方式:

How to combine 2 or more querysets in a Django view?