我有一个有生日的人物模型。我想创建一个查询,返回所有人的信息以及一个额外的字段,告诉有多少人分享每个人的生日。在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查询集我可以进行内部选择,但我不知道如何进行内连接。
答案 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 }}