2013-11-01 43 views
0

我在Django的模型,看起來像這樣(我已經簡化表&跳過不相關的領域,我不能改變表/關係。):獲取數據通過相關的外鍵

Class Attachment(models.Model): 
    name = models.CharField() 

Class Email(models.Model): 
    subject = models.CharField() 
    from = models.ForeignKey(User) 
    attach = models.ForeignKey(Attachment) 

Class User(models.Model): 
    name = models.CharField() 

在我看來,我想查找發送此附件的所有Users。所以,首先我獲取所有包含此附件

my_attachment = Attachment.objects.get(name='Picture1.jpg') 
email_set  = my_attachment.email_set.all() 

什麼是獲取所有在電子郵件的from字段中列出email_set即不通過email_set循環用戶的高效方式的電子郵件。

回答

1

這是最簡單和有效的方式

users = (User 
      .objects 
      .filter(email__attachment__name = 'Picture1.jpg') 
      .distinct() 
     ) 

記住創建所需的索引到你的數據庫表。

+1

User.objects.filter肯定? – hellsgate

+0

當然!謝謝@ hellsgate! – danihp

+0

在Django中工作和看起來很簡單 但它轉化爲一個可怕的sql語句:SELECT'user'.'id','user'.'name' FROM'user' INNER JOIN' email' ON('user'.' (''email'.'attach_id' ='attachment'.'id')WHERE'attachment'.'name' =%Picture1.jpg% – Medorator