2015-11-25 40 views
1

有有許多連接的兩個型號衆多領域Django的查詢集:SELECT相當於兩個連接模型的所有領域

我想查詢都和取得成果的反規範化的列表:

class Skills(models.Model): 
    skill = CharField(max_length=100) 
    ... 

class Person(models.Model): 
    name = CharField(max_length=100) 
    skills = models.ManyToManyField(Skills, blank=True) 

eg結果對象:

result.name, result.skill 

tom,carpentering 
tom,painting 
tom,handywork 
pete,carpentering 
pete,woodwork 

我想將這個結果放在一個對象中。有沒有一個聰明的方法來實現這一目標?

回答

2

可以使用values()

results = Person.objects.values('name', 'skills__skill') 
for result in results: 
    print(result['name'], result['skills__skill']) 

在這種情況下,它是直線前進,因爲字段的數量少這樣做。如果有更多的字段,那麼代碼會變得很長,或者你需要以某種方式反思字段名稱。

+0

使用values_list解決了我的問題。感謝您的回答。雖然我只能訪問結果[0]和結果[1]的值。 「skills__skills」 – caliph

+0

我的答案中有幾個錯誤,我現在已經修正了,正如你所說的,它應該是'skill__skill',帶兩個下劃線。另外,如果你使用'values'而不是'values_list',那麼你可以通過屬性名來訪問,例如'result ['values_list']'。 – Alasdair

+0

真棒,或許在查詢和對象管理中使用「__」有一些好的解釋嗎? – pptt