>我有 3 个模型及其关系:
class Itinerary(models.Model):
origin_dest = models.CharField(max_length=200, blank=False, default="")
travelers = models.ManyToManyField('Traveler')
flights = models.ManyToManyField('Flight')
class Traveler(models.Model):
pass
class Flight(models.Model):
pass
一个行程有一个或多个航班(经停与直达(,一个航班可以属于多个行程。此外,旅行者可以有很多行程,一个行程可以有很多旅行者。原因如下:
假设traveler 1
有一个从肯尼迪国际机场飞往MIA的航班,在MIA有1站。然后行程将有 2 个航班(肯尼迪国际机场-米亚机场、米亚机场-洛杉矶国际机场(。现在假设我们有另一个人,traveler 2
有一个从MIA-LAX出发的行程,该行程与从MIA-JFK出发的traveler 1
航班相同(不同的行程实例,但共享相同的航班(。因此,在这种情况下,有 2 个行程,其中单个航班 (MIA-LAX( 属于这两个行程,因此是多对多关系。
现在,理想情况下,我想做的是通过行程模型查询特定航班上的所有旅客。像这样:
flight.itinerary_set.travelers #=> return the number of travelers that are on that specific flight.
你可能想要一个中间对象,例如 Booking
,这总是一个航班和一个旅行者。这样就不会混淆哪个旅行者乘坐哪个航班,这似乎是一个非常重要的区别,除非出于某种原因与您的用例无关。
该案例的示例模型:
from django.db import models
class Traveler(models.Model):
name = models.TextField()
def __str__(self):
return self.name
class Flight(models.Model):
number = models.TextField()
def __str__(self):
return self.number
class Itinerary(models.Model):
pass
class Booking(models.Model):
itinerary = models.ForeignKey(
Itinerary,
related_name='bookings',
on_delete=models.CASCADE,
)
traveler = models.ForeignKey(
Traveler,
related_name='bookings',
on_delete=models.CASCADE,
)
flight = models.ForeignKey(
Flight,
related_name='bookings',
on_delete=models.CASCADE,
)
测试用例的部分输出如下。请注意,这将创建两个独立的行程,在同一航班上进行独立预订。
>>> from itineraries.models import Traveler, Flight, Itinerary, Booking
>>>
>>> f = Flight.objects.create(number='JAL1')
>>>
>>> Booking.objects.create(
... itinerary=Itinerary.objects.create(),
... traveler=Traveler.objects.create(name='kungphu'),
... flight=f,
... )
<Booking: Booking object (5)>
>>>
>>> Booking.objects.create(
... itinerary=Itinerary.objects.create(),
... traveler=Traveler.objects.create(name='Cyzanfar'),
... flight=f,
... )
<Booking: Booking object (6)>
>>>
>>> # Travelers on flight f:
>>> for t in Traveler.objects.filter(bookings__flight=f):
... print(t)
...
kungphu
Cyzanfar