假设我们有 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。
答案 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
个对象。
现在,如果h1
是House
的对象,您可以执行以下操作..
rooms_total = 0
for room in h1.rooms.all():
rooms_total += room.beds