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

问题描述 投票:1回答:1

我知道可以使用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()

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

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

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

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

在原始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,更具体地说,那个priceavailability

python django django-models django-orm
1个回答
2
投票

使用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)

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

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

这是一个性能增强器,它会导致单个更复杂的查询,但意味着以后使用外键关系不需要数据库查询。

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.