Django过滤与其他模型的外键相关的模型的查询集?

Posted

技术标签:

【中文标题】Django过滤与其他模型的外键相关的模型的查询集?【英文标题】:Django filter queryset of a models that are related with a foreign key to other model? 【发布时间】:2021-09-08 22:47:34 【问题描述】:

我有一个简单的问题。 我有两个模型(服务员和经理),它们都包含与餐厅相同的外键:

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)

所以我需要让所有服务员都知道 restaurant=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)

但是有什么方法可以让我在一个查询中做到这一点。

【问题讨论】:

【参考方案1】:

但是有什么方法可以让我在一个查询中做到这一点。

这是在一个查询中,但它适用于子查询可能效率不高。

但是,您可以使用更紧凑的方式进行过滤:

Waiters.objects.filter(<b>restaurant__managers=request.user.id</b>)

我们可以使用双下划线 (__) 来“透视”关系。因此,在这里我们正在寻找Waiters 对象,它的餐厅与给定ID 为request.user.idManagers 对象相关。

【讨论】:

哇!我在这里被困了一个星期,我无法弄清楚。但是您能否解释一下这是如何工作的,因为我不太了解。 我正在研究这个并发现如果我有一个属于同一家餐厅的不同经理这将不起作用:Waiters.objects.filter(restaurant__managers=request.user.id) 因为我们正在寻找当前用户的请求 ID,所以这样做意味着我需要回到这个:manager = Managers.objects.filter(id=request.usr.id) queryset=Waiters.objects.filter(restaurant=manager.restaurant_id) 或者有什么方法可以直接过滤属于同一家餐厅的服务员和经理我有点困惑。 @AstritMaliku: 但是一个Manager只指一个Restaurant,如果同一个用户有多个相关的Managers,它会列出所有在一家餐厅工作的Waiters用户,因此如果request.user 管理这些餐厅,我们可以检索多个餐厅的服务员。 @AstritMaliku:你能用样本数据编辑问题吗?它不返回预期的查询集? 我正在做类似的事情来获取另一个模型中的相关对象,我认为 request.user 仅适用于该特定用户,但正如您提到的 if the same user has multiple related Managers, it will list all Waiters。所以问题出在我的关系而不是查询中。一切都好,谢谢。我将在评论中删除我的问题,因为没有必要。 @Willem Van Onsem【参考方案2】:

这个怎么样??

queryset = Managers.objects.filter(id=request.usr.id and Waiters.objects.filter(restaurant=manager.restaurant_id))

【讨论】:

它当然可以,但我不太确定性能,这就是我寻找更好解决方案的原因。我认为@Willem Van Onsem 的回答是正确的。

以上是关于Django过滤与其他模型的外键相关的模型的查询集?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用格式化的日期时间字段获取 django 查询集结果

如何使用Django中的外键关系中的任何/ exists / all逻辑检索查询集?

Django:强制选择相关?

在main函数中使用django模型(附django正反向的外键关联查询)

按外键/相关字段分组 django 查询集

在laravel中的两个相关模型中过滤