我有以下型号:

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 的 ID,并且想获取那条街上所有房屋的所有房间。在 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 中进行多个查询或过滤,这两者本质上都是低效的。另一种选择是原始查询,我猜...

最佳答案

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

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

这可以根据需要尽可能多地完成,要按街道名称选择房间,您可以这样做:
Room.objects.select_related('house').filter(house__street__name=xyz)

查看详细信息 here

关于django - 如何在 Django 中过滤加入的模型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48685555/

10-10 13:44
查看更多