2011-07-08 65 views
0

Django的複雜查詢我有兩個型號,使得不使用循環

class Employer(models.Model): 
    name = models.CharField(max_length=1000,null=False,blank=False) 
    eminence = models.IntegerField(null=False,default=4) 

class JobTitle(models.Model): 
    name = models.CharField(max_length=1000,null=False,blank=False) 
    employer= models.ForeignKey(JobTitle,unique=False,null=False) 

class People(models.Model): 
    name = models.CharField(max_length=1000,null=False,blank=False) 
    jobtitle = models.ForeignKey(JobTitle,unique=False,null=False) 

我想列出隨機5名僱主和僱主每一個職位。但是,應該從人數最多的僱主的前10個職位中提取職位。

一種方法可能是

employers = Employer.objects.filter(isActive=True).filter(eminence__lt=4).order_by('?')[:5] 

for emp in employers: 
    jobtitle = JobTitle.objects.filter(employer=emp)... and so on. 

然而,遍歷選擇的僱主可能會ineffiecent。有沒有辦法在一個查詢中做到這一點?

謝謝

回答

0

我已經寫了這樣的代碼塊,它的工作原理。雖然我循環了employers,因爲我已經使用select_related('jobtitle'),但我認爲它不會觸及數據庫並且工作得更快。

employers = random.sample(Employer.objects.select_related('jobtitle').filter(eminence__lt=4,status=EmployerStatus.ACTIVE).annotate(jtt_count=Count('jobtitle')).filter(jtt_count__gt=0),3) 

jtList = [] 
for emp in employers: 
    jt = random.choice(emp.jobtitle_set.filter(isActive=True).annotate(people_count=Count('people')).filter(people_count__gt=0)[:10]) 
    jtList.append(jt) 
0

有!檢出:https://docs.djangoproject.com/en/dev/ref/models/querysets/#select-related

select_related()告訴Django使用JOIN遵循所有外鍵關係。這將導致一個大的查詢,而不是許多小的查詢,這在大多數情況下是你想要的。你得到的QuerySet將被預先填充,Django將不必從數據庫中延遲加載任何東西。

我以前用過select_related()來解決這個確切的問題。

+0

你能看我的答案嗎?我不確定實際的解決方案..謝謝 – brsbilgic