我有以下型号:
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/