保存方法覆盖属性值的问题

Problem with save method overriding attribute value

我有一个名为 'Trip' 的模型,其外键为 'Destination'。 Destination 模型在其 'max_passengers' 属性中指定了最大乘客数。

旅行

class Trip(models.Model):

    destination = models.ForeignKey(
        Destination,
        null=True,
        blank=False,
        on_delete=models.SET_NULL,
        related_name="trips",
    )
    date = models.DateTimeField()
    seats_available = models.IntegerField(
        null=False, blank=False, editable=False
    )
    trip_ref = models.CharField(
        max_length=32, null=True, editable=True, blank=True
    )

目的地

class Destination(Product):

    max_passengers = models.IntegerField(null=True, blank=True)
    duration = models.CharField(max_length=20, blank=True)
    addons = models.ManyToManyField(AddOn)
    min_medical_threshold = models.IntegerField(
        default=0, null=False, blank=False
    )

    def __str__(self):
        return self.name

回到 Trip 模型,我重写了模型保存方法,以便在创建 trip 对象时,该实例的 'seats_available' 设置为相关目的地的 'max_passengers' :

def save(self, *args, **kwargs):

    if not self.trip_ref:
        date = (self.date).strftime("%m%d-%y")
        self.trip_ref = self.destination.pk + "-" + date

    if not self.seats_available:
        self.seats_available = self.destination.max_passengers
    super().save(*args, **kwargs)

我有额外的预订和乘客模型。创建预订时,会发送一个 post_save 信号,调用我的 Trips 模型上的模型方法,def update_seats_avaialable():

def update_seats_available(self):

    reservations = (
        self.bookings.aggregate(num_passengers=Count("passengers"))
        ["num_passengers"]
    )
    self.seats_available = self.destination.max_passengers - reservations
    self.save() <---- PROBLEM

问题是当所有座位最终都被占用时。乘客人数 = max_passengers 和可用座位数 = 0。当 self.save 触发保存方法时,if not self.seats_available = true 所以这行代码是 运行:self.seats_available = self.destination.max_passengers 将可用座位设置回开始的位置。还有另一种初始化模型对象的方法吗?我的理解是不建议使用 init 方法...

好的,我想到了一个解决方案:

def update_seats_available(self):

    reservations = (
        self.bookings.aggregate(num_passengers=Count("passengers"))
        ["num_passengers"])
    self.save(reservations=reservations)

def save(self, *args, **kwargs):


    if not self.trip_ref:
        date = (self.date).strftime("%m%d-%y")
        self.trip_ref = self.destination.pk + "-" + date

    reservations = kwargs.pop('reservations', 0)
    self.seats_available = self.destination.max_passengers - reservations
    super().save(*args, **kwargs)

这里我将保留值传递给保存方法并在那里进行计算。