gpt4 book ai didi

python - 如何使用 Django ORM 通过相关对象查询模型并获取查询集中的相关对象

转载 作者:行者123 更新时间:2023-12-01 01:38:29 25 4
gpt4 key购买 nike

我知道可以使用 Django ORM 使用反向相关字段来查询模型。但是是否也可以获取查询匹配的反向相关模型的所有字段?

例如,如果我们有以下模型:

class Location(models.Model):
name = models.CharField(max_length=50)


class Availability(models.Model):
location = models.ForeignKey(Location, on_delete=models.CASCADE)

start_datetime = models.DateTimeField()
end_datetime = models.DateTimeField()

price = models.PositiveIntegerField()

是否可以找到所有 Location在特定时间范围内可用的并且还获得 price Location的在该可用性期间?我们假设Availability具有相同位置的对象不能有重叠的开始/结束日期时间。

如果user_start_datetimeuser_end_datetime由用户输入,那么我们可能会执行如下操作:

Location.objects.filter(
availability__start_datetime__lte=start_datetime,
availability__end_datetime__gte=end_datetime)

但我不知道如何获得 price特定字段availability这确实导致了查询的匹配。

在原始 SQL 中,我正在讨论的行为可以通过如下方式实现:

SELECT l.id, l.name, a.price
FROM Location l
INNER JOIN Availability a
ON a.location_id = l.id
WHERE /* availability is within user-inputted timeframe */

我考虑过使用类似 prefetch_related('availability_set') 的东西,但这只会为我提供 Location所有可用性。与查询匹配的对象。我只想要一个 availability这是在查询的时间范围内,更具体地说,price其中availability .

最佳答案

当您使用 ORM 时,通常一次从一个模型类获取结果。由于 LocationAvailability 是单独的模型,因此您只需执行以下操作:

availabilities = Availability.objects.filter(
start_datetime__lte=start_datetime,
end_datetime__gte=end_datetime)
for availability in availabilities:
print(availability.location.id, availability.location.name, availability.price)

这是一个易于阅读的实现。

现在,从 Availability 对象(在 availability.location 中)访问 Location 需要第二个 SQL 查询。您可以使用 select_related 对此进行优化:

This is a performance booster which results in a single more complex query but means later use of foreign-key relationships won’t require database queries.

只需将其附加到您的原始查询中,即:

availabilities = Availability.objects.select_related('location').filter(...

这将在后台创建一个 SQL 连接语句,并且 Location 对象不需要额外的查询。

关于python - 如何使用 Django ORM 通过相关对象查询模型并获取查询集中的相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52157206/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com