如何在Django中过滤联接的模型?

时间:2018-02-08 12:29:15

标签: django join filter django-queryset

我有以下型号:

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中进行多个查询或过滤,这两者本身都是低效的。另一种选择是原始查询,我猜......

1 个答案:

答案 0 :(得分:4)

您可以使用__语法访问相关对象的字段:

Room.objects.select_related('house').filter(house__street=xyz)

这可以在您需要的时间内完成,按街道名称选择房间,您可以这样做:

Room.objects.select_related('house').filter(house__street__name=xyz)

Chech详情here