我正在研究火车订票系统项目,我想获取座位号和位置,所以我开设了一个有帮助的座位类。问题是我想当管理员从管理面板中添加新火车 时,seats类会自动将100个座位添加到DB中,因为我认为管理员将添加新的火车没有任何意义手动100个座位
答案 0 :(得分:1)
从技术上讲,有多种解决方案可以解决您的问题:
post_save
signal。save()
模型上覆盖Train
方法。save_model()
method创建一个ModelAdmin
子类。如果要确保在不创建关联的Train
实例的情况下无法创建Seat
,请覆盖save()
。使用信号会使您的耦合稍微松散一些,但我认为这不会给您带来任何好处。
覆盖save()
时,可以检查self.pk
是否为None
,以查看是否创建或更新了模型:
# models.py
class Train(models.Model):
...
def save(self, *args, *kwargs):
created = self.pk is None
super().save(*args, **kwargs)
if created:
self.create_seats()
如果您只想在通过管理员创建火车时创建座位,请创建自定义ModelAdmin
:
class TrainAdmin(admin.ModelAdmin):
def save_model(self, request, obj, form, change):
super().save_model(request, obj, form, change)
if not change:
obj.create_seats()
两个示例均假设您的Train
类具有create_seats()
方法。
答案 1 :(得分:0)
您可以覆盖模型的保存方法,或在Train模型上使用post_save信号。
第一种方法,覆盖模型保存方法:
class Train(models.Model):
.
.
.
def save(self, *args, **kwargs):
is_new = not self.pk
# Call save method of super
super(Train, self).save(*args, **kwargs)
# Add your seats here
第二种方法,使用信号将其写入您的models.py文件:
@receiver(models.signals.post_save, sender=Train)
def post_train_save(sender, instance, created, *args, **kwargs):
if created:
# Add your seats here