Django ORM:使用特征计算相关对象

时间:2013-12-12 17:43:29

标签: python django aggregate django-queryset

假设我们有 House Room 模型。
每个房屋都有几个房间,每个房间都有一些房间

如何选择每个房屋的卧室数量?所有房屋必须出现在结果中。

模型类:

class House(models.Model):
    pass

class Room(models.Model):
    house = models.ForeignKey('House')
    beds = models.IntegerField()

我试过了:

House.objects.filter(room__beds__gt=0).annotate(bedrooms=Count('room'))

但是这个解决方案不包含没有卧室的房屋。

我不想使用纯SQL。

3 个答案:

答案 0 :(得分:1)

试一试。

House.objects.extra(select={
        "bedrooms": "SELECT count(*) FROM YOURAPP_room WHERE house_id=YOURAPP_house.id AND beds > 0"})

答案 1 :(得分:1)

您可以在查询中添加没有卧室的房屋,如下所示:

from itertools import chain
from django.db.models import Q, Count

qs = House.objects.all()
q = {'room__beds__gt': 0}
qs_with = qs.filter(Q(**q)).annotate(bedrooms=Count('room'))
qs_without = qs.filter(~Q(**q)).extra(select={'bedrooms': 0})
qs_all = chain(qs_with, qs_without)

答案 2 :(得分:0)

在Room类的house字段中添加related_name。它看起来像这样:

house = models.ForeignKey('House', related_name='rooms')

然后您可以从Room个对象访问House个对象。

现在,如果h1House的对象,您可以执行以下操作..

rooms_total = 0

for room in h1.rooms.all():
  rooms_total += room.beds