2014-05-25 163 views
0

那麼,我開始學習Django,現在我有問題得到一個QuerySet,允許我填表。Django一對多關係查詢

該表顯示有關程序員項目的信息。每個項目有n次迭代。

| id |名稱|起始|結束|成本|目標|描述|客戶|進展|狀態|迭代|

在視圖中,我可以用一個QuerySet這樣拿到第9列(從項目模型):

projects = Project.objects.filter(responsible = request.user.id) 

在第10欄我必須展示「迭代」的數量每一個項目,我想這一點:

Proyect.objects.filter(responsible = request.user.id).annotate(Niterations= Iteration.objectsfilter(project_id= request.user.id).count()) 

很好,這是行不通的,據我所知,與註釋的參數將被加入到查詢集的每個對象...

IWAS嘗試另一種方式是:

projects = Project.objects.filter(responsible = request.user.id) 
for proy in projects: 
    proy.annotate(Iteration.objects.filter(project_id=proy.pk).count()) 

我不知道到底whay它不工作...有沒有更簡單的方法?

這是一個有點混亂......

我有兩個型號的工作: 「項目」 和 「迭代」

型號:項目

from django.db import models 
from usuarios.models import User 

class Proyect(models.Model): 
    name = models.CharField(max_length=255) 
    start = models.DateField() 
    end = models.DateField(blank=True, null=True) 
    cost = models.FloatField(blank=True, null=True) 
    objetive = models.TextField(blank=True, null=True) 
    description = models.CharField(max_length=255, blank=True, null=True) 
    client = models.CharField(max_length=255, blank=True,null=True) 
    progress = models.FloatField(verbose_name=u'percentage of progress', default=0.00, editable=False) 
    responsible = models.ForeignKey(User, editable=False) 
    STATUS_CHOICES = (
     ('A','Atrasado'), 
     ('N','Normal'), 
     ('AP','Alta prioridad'),   
     ) 
    status = models.CharField(max_length=2, choices=STATUS_CHOICES) 

    def __unicode__(self): 
     return self.name 

型號:迭代

from django.db import models 
from proyectos.models import Project 

class Iteration(models.Model): 
    identifier = models.CharField(max_length=255) 
    start = models.DateField() 
    end = models.DateField() 
    progress = models.FloatField(default=0.0, editable=False) 
    project = models.ForeignKey(Project) 

在此先感謝!

(我翻譯這一點,如果很抱歉,我們在翻譯的錯誤)

+3

您的Proyect對象與Iteration具有反向關係。在彙總文檔中查看[以下反向關係](https://docs.djangoproject.com/en/1.6/topics/db/aggregation/#following-relationships-backwards)。如果這不適合你,請更新你的問題。 –

回答

0

正確的做法是:

Project.objects.filter(responsible=request.user.id).annotate(niterations=Count('iteration') 

你可以看到,查詢更好地理解:

result = Project.objects.filter(responsible=request.user.id).annotate(niterations=Count('iteration') 
print str(result.query) 

我希望我能幫上忙。

+0

您的代碼完美無缺@Patrícia!!!所以,這裏是查詢的結構,可能需要它的人: SELECT'projects_project'.'id','projects_project'.'name','projects_project'.objetive','projects_project' ''description',.....,COUNT('iterarions_iteration'.'id')AS'niterations' FROM'projects_project' LEFT OUTER JOIN'iterations_iteration' ON('projects_project'.'id' ='iterations_iteration'.' project_id')WHERE'projects_project'。'responsible_id' = 1 GROUP BY'projects_project'.'id' ORDER BY NULL –