2014-07-05 88 views
1

我有一個表,看起來像這樣的Django通過查詢相關的表訪問的M2M領域的屬性

class Person(User): 
    """ 
    This model represents person's personal and 
    professional details. 
    """ 
    attribute1 = models.CharField(max_length=100) 
    attribute2 = models.TextField() 
    attribute3 = models.TextField() 
    attribute4 = models.ForeignKey(Receptionist) 
    referred_attribute1 = models.ManyToManyField(Hobby) 


class Hobby(models.Model): 
    name = models.CharField(max_length=100) 

使用案例: 一個 P1具有愛好 H1,H2,H3(在表Hobby中定義[3個單獨的條目])。 現在我想檢索一個具有所有屬性和屬性的Person對象,包括Hobbies。對於我正在執行以下事項:

Person.objects.values("attribute1", 
         "attribute2", 
         "referred_attribute1").get(attribute3="p1's attribute") 

我要的是:

{'attribute1':'p1_attribute1', 
'attribute2':'p1_attribute2', 
'referred_attribute':['h1','h2','h3']} 

什麼,我得到的是:

[{'attribute1':'p1_attribute1', 
    'attribute2':'p1_attribute2', 
    'referred_attribute':'h1'}, 
{'attribute1':'p1_attribute1', 
    'attribute2':'p1_attribute2', 
    'referred_attribute':'h2'}, 
{'attribute1':'p1_attribute1', 
    'attribute2':'p1_attribute2', 
    'referred_attribute':'h3'}] 

有沒有辦法讓我想要的結果直接從一個查詢集?由於我不想手動重新安排上述結果!

+0

這不是一個直接的答案,只是一個建議:對多對多關係使用不同的查詢,然後加入它。 – alejoss

+0

「使用不同的查詢」 - 你能詳細說明嗎? – tehkidnextdoor

回答

0

而是執行此操作:

p1 = Person.objects.get(attribute3="p1's attribute") 

P1是人的情況下,你就可以從中檢索了所有的屬性。例如:

p1_attribute1 = p1.attribute1 
p1_hobbies = p1.referred_attribute1.all() 

現在可以重新安排數據,只要你喜歡,例如,使愛好列表如下:

hobby_list = p1_hobbies.values_list('name', flat=True) 

我會重新命名referred_attribute1以興趣愛好爲代碼的可讀性

+0

我已經這麼做了。癢是我有很多數據和重新安排,這不是最有效的方式。我需要一個可以執行的查詢集以獲得所需格式的值。 PS:我把它命名爲「愛好」。爲了上下文的目的,把它放在這裏。 :) – tehkidnextdoor

0

像這樣的東西應該在這種情況下工作:

[{'attribute1': res.attribute1, 'attribute2': res.attribute2, 
    'referred_attribute1': [a.name for a in res.referred_attribute1.all()]} 
    for res in Person.objects.prefetch_related('referred_attribute1').filter(attribute3="p1's attribute")] 

另見Django's Prefetch-related