1

如何使用Django 1.8 ORM來計算對象具有多少個成員?Django 1.8:查詢集成員的註釋數不經過濾

例如: 我該如何按軟件計數排序所有工人,他們的公司正在使用?

  • 比爾3(Windows和Office,Visio中)
  • 湯姆2(Windows和Office)
  • 安東1(辦事處)
  • 彼得0
  • 斯蒂芬0

代碼:

def Software(model.Model): 
    name = models.CharField(max_length=200) 

def Company(models.Model): 
    software = models.ManyToManyField(Software) 

def Worker(models.Model): 
    company = models.ForeignKey(Company) 

software = Software.objects.filter(price>60) # [<Software: Windows>,...] 
workers = Worker.objects.filter(company__software__in=software). 
      annotate(software_count=Count('company__software‘)) 

for worker in workers: 
    print „%s %s (%s)" % (worker.name, worker.software_count, ...) 

棘手的部分是我不想過濾但只想要註釋給定列表使用的軟件的計數。

任何幫助理解:-)

+0

Thx爲輸入。是的 - 這給出了* all *軟件的數量。我需要像'Worker.objects.annotate(software_count = Count(company_software_in = software))' – buLLfisH

回答

1

貌似conditional aggregation(或註釋在這種情況下)。代碼未經測試,但應如下所示:

class Software(model.Model): 
    name = models.CharField(max_length=200) 
    price = models.DecimalField(max_digits=8, decimal_places=2) 

class Company(models.Model): 
    software = models.ManyToManyField(Software) 

class Worker(models.Model): 
    company = models.ForeignKey(Company) 

workers = Worker.objects.all().annotate(software_count=Sum(
    Case(When(company__software__price__gt=60, then=1), output_field=IntegerField()) 
)) 

for worker in workers: 
    print "%s %s" % (worker.name, worker.software_count) 

但是,您沒有使用的軟件列表。我想要在相同的查詢中得到這個結果,你必須更深入地瞭解SQL,但我發現無法通過ORM實現它。那麼,也許這可能與Func() expression和使用SQL函數GROUP_CONCAT。但我擔心這超出了我的水平。

+1

非常感謝!您的評論幫助我找到了解決方案。 您的註釋數**所有**軟件(不是列表中的一個)。但通過以下注釋,我可以得到該列表中軟件的數量。 'Worker.objects.annotate(software_count = SUM( 案(當(company__software__in =軟件,那麼= 1),默認= 0,output_field = IntegerField())))ORDER_BY( 「 - software_count」)。' – buLLfisH

+0

我的代碼出錯了。嘗試用When(company__software__price__gt = 60,then = 1)替換When子句。我在原來的文章中改變了它,但是當然你想要檢查價格> 60而不是軟件> 60.然後,一切都在單個查詢中 – ascripter