我有以下型号:
class Street(models.Model):
name = models.CharField(max_length=40)
class House(models.Model):
street = models.ForeignKey(Street, models.PROTECT)
number = models.CharField(max_length=10)
class Meta:
unique_together = ('street', 'number')
class Room(models.Model):
house = models.ForeignKey(House, models.PROTECT)
number = models.CharField(max_length=10)
class Meta:
unique_together = ('house', 'number')
我已经知道Street
的身份证,并希望获得该街道所有房屋的所有房间。在SQL中很简单:
SELECT *
FROM room JOIN house ON house.id = room.house_id
WHERE house.street_id = xyz;
现在我如何在Django中执行此操作?我试过了
Room.objects.select_related('house').filter(street=xyz)
但我得到一个例外,说我无法访问此字段:
django.core.exceptions.FieldError: Cannot resolve keyword 'street' into field. Choices are: house, house_id, id, number
由于我面临的数据量很大,我真的希望能够使用单个查询加入和过滤!当放弃一个或另一个时,我将不得不求助于在Python中进行多个查询或过滤,这两者本身都是低效的。另一种选择是原始查询,我猜......
答案 0 :(得分:4)
您可以使用__
语法访问相关对象的字段:
Room.objects.select_related('house').filter(house__street=xyz)
这可以在您需要的时间内完成,按街道名称选择房间,您可以这样做:
Room.objects.select_related('house').filter(house__street__name=xyz)
Chech详情here。