我知道可以使用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
s并且在该可用性期间还获得price
的Location
?我们假设具有相同位置的Availability
对象不能具有重叠的开始/结束日期时间。
如果用户输入user_start_datetime
和user_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时,通常一次从一个模型类中获取结果。由于Location
和Availability
是单独的模型,您可以简单地执行以下操作:
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
对象将不需要额外的查询。