在数据库中创建自动对象(Django)

时间:2018-11-30 09:42:05

标签: python django

我正在研究火车订票系统项目,我想获取座位号和位置,所以我开设了一个有帮助的座位类。问题是我想当管理员从管理面板中添加新火车 时,seats类会自动将100个座位添加到DB中,因为我认为管理员将添加新的火车没有任何意义手动100个座位

2 个答案:

答案 0 :(得分:1)

从技术上讲,有多种解决方案可以解决您的问题:

  1. 您可以收听post_save signal
  2. 您可以在save()模型上覆盖Train方法。
  3. 您可以使用自定义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