如何通过django模型查询创建左连接组

时间:2015-03-06 06:59:38

标签: python django django-models

您好我将django模型声明如下,我只想通过查询运行简单的左连接。

Mysql查询

SELECT  u.name, COUNT('j.*') as num_jobs FROM `User` as u 
LEFT JOIN Job as j ON u.id = j.userId_id GROUP BY j.userId_id

以上查询是获取每个用户的工作计数。

Django模型

from django.db import models


class Users(models.Model):       
    name = models.CharField(max_length=60,verbose_name="Name",null=True, blank=True)
    email_id = models.CharField(max_length=60,verbose_name="Email Id",null=True, blank=True)
    phonenumber = models.CharField(max_length=20, verbose_name="Phone Number")
    class Meta:
        verbose_name_plural = "Users"
        verbose_name = "Users"
        db_table = "User"
    def __unicode__(self):
        return  str(self.phonenumber) + ": "+ str(self.name)  

class Job(models.Model):
    userId = models.ForeignKey(Users)
    title = models.CharField(max_length=128,verbose_name="Title")
    description = models.TextField(verbose_name="Description",null=True, blank=True)
    class Meta:
        verbose_name_plural = "Job"
        verbose_name = "Job"
        db_table = "Job"
    def __unicode__(self):
        return  self.title

我是否需要调整模特中的任何内容,请指导我!

2 个答案:

答案 0 :(得分:4)

试试这个

from django.db.models import Count

# import your model (Job)

Job.objects.values('userId').annotate(c=Count('userId')).values('userId__name','c')

values('userId')后跟的annotate将按userId进行计数和分组。

输出将是这样的词典列表:

[{'userId__name':'John','c':20},]

用户John有20个相关的Job个对象。

在不相关的说明中,每当模型中有外键时。通常最好先写user而不是userId

在编写查询和访问关系时更有意义(user__name而不是userId__name)。

<强>更新

如果您需要其他属性,请将它们作为参数添加到第二个values调用中,如下所示:

Job.objects.values('userId').annotate(c=Count('userId'))\
.values('userId__name','userId__email_id','c')

答案 1 :(得分:0)

我认为最直接的解决方案是通过以下方式获取用户对象:

users = User.objects.filter(<filtering-expression-here>)

获得用户后,您可以考虑他所拥有的工作数量:

for user in users:
    print "User '%s' has %s jobs" % (user.name, str(user.job_set.count()))

PS:此建议假定您将“用户”模型重命名为“用户”(不含s)

编辑:我将len(...)更改为.count()