Django一对多关系查询

时间:2014-05-25 05:49:02

标签: django django-models orm django-views

好吧,我正在开始学习Django,现在我遇到了一个问题,我可以使用QuerySet来填充表格。

该表显示了有关程序员项目的信息。每个项目都有n次迭代。

  

| ID |名称|开始|结束|成本| Objetive |简介|客户|进展|状态|迭代|

在View中,我可以使用如下的QuerySet获取前9列(来自Project模型):

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())

嗯,它不起作用,我理解通过注释,参数将被添加到QuerySet中的每个对象......

我尝试的另一种方式是:

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

我不确切知道它不起作用......有更简单的方法吗?

这有点令人困惑......

我正在使用两个模型:“Project”和“Iteration”

型号:项目

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)

提前致谢!!!

(我翻译了这个,抱歉如果翻译有错误)

1 个答案:

答案 0 :(得分: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)

我希望我能帮到你。