如何使用Django模型查询创建带有分组的左联接

Gow*_*wri 3 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
Run Code Online (Sandbox Code Playgroud)

上面的查询正在获取每个用户的作业计数。

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
Run Code Online (Sandbox Code Playgroud)

我需要调整模型中的任何内容吗,请指导我!

Ked*_*dar 5

尝试这个

from django.db.models import Count

# import your model (Job)

Job.objects.values('userId').annotate(c=Count('userId')).values('userId__name','c')
Run Code Online (Sandbox Code Playgroud)

首字母values('userId')后跟annotate将进行计数和分组userId

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

[{'userId__name':'John','c':20},]
Run Code Online (Sandbox Code Playgroud)

用户那里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')
Run Code Online (Sandbox Code Playgroud)