在Django ORM中加入两个查询

时间:2015-08-04 00:27:59

标签: django django-models orm django-orm

我有一个有生日的人物模型。我想创建一个查询,返回所有人的信息以及一个额外的字段,告诉有多少人分享每个人的生日。在SQL中我会这样写:

SELECT p.name, b.count FROM persons as p INNER JOIN (SELECT birthday as date, COUNT(*) AS count FROM persons GROUP_BY birthday) AS b WHERE p.birthday = b.date

使用Django查询集我可以进行内部选择,但我不知道如何进行内连接。

2 个答案:

答案 0 :(得分:1)

似乎很难处理ORM(尽管可能使用extra)。

您可以按日期创建一个计数字典(最多366个值,如果忽略年份):

 from django.db.models import Count
 birthdate = lambda d: d.strftime("%m-%d")

 # this runs the subquery in your SQL:
 birthdays = Person.objects.values('birthday')
 counts = birthdays.annotate(count=Count('birthday'))

 counts_by_date = {
     birthdate(r['birthday']): r['count'] 
     for r in counts
 }

 for person in Person.objects.all():
     count = counts_by_date[birthdate(person.birthday)]
     print "%d people share your birthday!" % count

答案 1 :(得分:0)

我会添加一个模型方法来计算。您可以使用ORM执行此操作:

from django.db import models

class Person(models.Model):
    birthdate = models.DateField()

    def shared_count(self):
        return Person.objects.filter(birthdate=self.birthdate).exclude(pk=self.id).count()

然后你可以像这样访问Person实例上的计数:

my_person = Person.objects.get(pk=12)
count = my_person.shared_count()

或者在这样的模板中访问它:

{{ my_person.shared_count }}