2014-01-29 72 views
0

我需要獲取所有公司的列表,並以最少的companyuser id加入公司用戶。 有兩種型號:Django ORM:加入到帶有外鍵的查詢集模型

class Company(models.Model): 
    name = models.CharField(max_length=255) 
    kind = models.CharField(max_length=255) 

class CompanyUser(models.Model): 
    company = models.ForeignKey('Company') 
    email = models.EmailField(max_length=40, unique=True) 
    #other fields 

我已經試過這樣的事情:

companies = Company.objects.all().select_related(Min('companyuser__email')) 

,但它不工作。我怎樣才能做到這一點與Django的ORM?有沒有辦法做到沒有原始的SQL?

+1

你是什麼意思'最小id'? –

+0

我的意思是數據庫中最小的id。 'companyuser.id' – Paul

+1

該ID由系統自動分配,您不應該依賴此來進行排序或其他目的。您是否試圖通過_number of users_訂購公司? –

回答

-1

正如布爾汗說 - 不依靠PK,但如果u必須...

companies = Company.objects.all().order_by('pk')[0] 
0
from django.db.models import Min 
Company.objects.annotate(lowest_companyuser_id=Min("companyuser__id")) 

說明

select_related()可用於告訴Django的它的相關表應加入到結果查詢集以減少查詢次數,即在循環查詢集並在迭代中訪問相關對象時解決可怕的「N + 1問題」。 (see docs

使用Min()您處於正確的軌道上,但它應該與annotate()查詢集方法一起使用。使用類似Min(),Max(),Count()等聚合表達式的annotate()可以在使用前述集合表達式中的一個與GROUP BY進行的SQL查詢中進行轉換。 (見docs about annotate() in Django,約GROUP BY in Postgres docs

+1

雖然此代碼片段可能會解決問題,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。也請儘量不要用解釋性註釋來擠佔代碼,這會降低代碼和解釋的可讀性! –