您好我将django模型声明如下,我只想通过查询运行简单的左连接。
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
以上查询是获取每个用户的工作计数。
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
我是否需要调整模特中的任何内容,请指导我!
答案 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()