2014-05-25 124 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 –