Py学习  »  Django

如何通过相关对象查询模型并使用django orm在查询集中获取相关对象

Farbod909 • 5 年前 • 1607 次点击  

我知道使用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 位置 在这段时间内?我们假设 Availability 具有相同位置的对象不能有重叠的开始/结束日期时间。

如果 user_start_datetime user_end_datetime 是由用户输入的,那么我们可以做如下的事情:

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

但我不知道该如何得到 价格 特定字段 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') 但是那只会让我 全部的 可用于 位置 与查询匹配的对象。我只是想要 可利用性 这是在查询的时间范围内,更具体地说,是 价格 其中 可利用性 .

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/37930
 
1607 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Selcuk
Reply   •   1 楼
Selcuk    6 年前

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)

availability.location select_related

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