与其他模型的外键相关的模型的 Django 过滤器查询集?
Django filter queryset of a models that are related with a foreign key to other model?
我有一个简单的问题。
我有两个模型(服务员和经理),它们都包含与餐厅相同的外键:
class Managers(BaseUser):
restaurant = models.ForeignKey(Restaurants, on_delete=models.CASCADE)
class Waiters(BaseUser):
restaurant = models.ForeignKey(Restaurants, on_delete=models.CASCADE)
餐厅型号:
class Restaurants(models.Model):
name = models.CharField(max_length=200)
description = models.TextField(max_length=250)
location = models.CharField(max_length=200)
rating = models.DecimalField(null=True, decimal_places=2, max_digits=5)
所以我需要让餐厅的所有服务员都=managers__restaurant_id。
我认为 SQL 会是:
select *
From Waiters w
Left outer join Managers m
On w.restaurant_id = m.restaurant_id
备注*
我可以像下面这样查询:
manager = Managers.objects.filter(id=request.usr.id)
queryset=Waiters.objects.filter(restaurant=manager.restaurant_id)
但是有什么方法可以在一次查询中完成。
But is there any way that i could do it in one query.
这是在一个查询中,但它可以与子查询一起使用,效率可能不高。
然而,您可以使用更紧凑的方式进行过滤:
Waiters.objects.filter(<b>restaurant__managers=request.user.id</b>)
我们可以使用双下划线 (__
) 来“透视”关系。因此,我们在这里寻找 Waiters
个对象,它的餐厅与 Managers
个对象相关,给定的 ID 为 request.user.id
。
这个怎么样??
queryset = Managers.objects.filter(id=request.usr.id and Waiters.objects.filter(restaurant=manager.restaurant_id))
我有一个简单的问题。 我有两个模型(服务员和经理),它们都包含与餐厅相同的外键:
class Managers(BaseUser):
restaurant = models.ForeignKey(Restaurants, on_delete=models.CASCADE)
class Waiters(BaseUser):
restaurant = models.ForeignKey(Restaurants, on_delete=models.CASCADE)
餐厅型号:
class Restaurants(models.Model):
name = models.CharField(max_length=200)
description = models.TextField(max_length=250)
location = models.CharField(max_length=200)
rating = models.DecimalField(null=True, decimal_places=2, max_digits=5)
所以我需要让餐厅的所有服务员都=managers__restaurant_id。
我认为 SQL 会是:
select *
From Waiters w
Left outer join Managers m
On w.restaurant_id = m.restaurant_id
备注* 我可以像下面这样查询:
manager = Managers.objects.filter(id=request.usr.id)
queryset=Waiters.objects.filter(restaurant=manager.restaurant_id)
但是有什么方法可以在一次查询中完成。
But is there any way that i could do it in one query.
这是在一个查询中,但它可以与子查询一起使用,效率可能不高。
然而,您可以使用更紧凑的方式进行过滤:
Waiters.objects.filter(<b>restaurant__managers=request.user.id</b>)
我们可以使用双下划线 (__
) 来“透视”关系。因此,我们在这里寻找 Waiters
个对象,它的餐厅与 Managers
个对象相关,给定的 ID 为 request.user.id
。
这个怎么样??
queryset = Managers.objects.filter(id=request.usr.id and Waiters.objects.filter(restaurant=manager.restaurant_id))