保存方法覆盖属性值的问题
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)
这里我将保留值传递给保存方法并在那里进行计算。
我有一个名为 '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)
这里我将保留值传递给保存方法并在那里进行计算。