通过Queryset Django 2.2的许多

2024-09-29 23:28:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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有一架从肯尼迪机场飞往洛杉矶的航班,在迈阿密有一站。然后行程将有2个航班(JFK-MIA,MIA-LAX)。现在让我们假设我们有另一个人,traveler 2他有一个从MIA-LAX来的行程,这个行程和从MIA-JFK来的航班是相同的(不同的行程实例,但是相同的航班是共享的)。因此,在本例中,有两个行程,其中一个航班(MIA-LAX)属于这两个行程,因此存在manytomy关系。你知道吗

现在我想做的理想情况是通过行程模型查询特定航班上的所有旅客。像这样的事情:

flight.itinerary_set.travelers #=> return the number of travelers that are on that specific flight.

Tags: 模型model关系modelspassclassflight航班
1条回答
网友
1楼 · 发布于 2024-09-29 23:28:48

您可能需要一个中间对象,例如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

相关问题 更多 >

    热门问题