ManyToMany through Queryset Django 2.2



>我有 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

相关内容

  • 没有找到相关文章

最新更新