【问题标题】:Creating automatic objects in the Database (Django)在数据库中创建自动对象 (Django)
【发布时间】:2018-11-30 09:42:04
【问题描述】:

我正在从事火车预订系统项目,我想访问座位号和位置,所以我创建了一个座位类,这会有所帮助。问题是我希望当管理员从管理面板添加新火车时,座位类会自动将 100 个座位添加到数据库中,因为我认为管理员将添加手动100座

【问题讨论】:

  • 在不了解您的全部要求的情况下,也许您最好在Train 类中拥有一个seats_available 字段并将其最初设置为100。在需要时(客户购买座位等)创建一个Seat 实例,并使用外键将其链接到Train 实例。

标签: python django


【解决方案1】:

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

  1. 您可以收听post_save signal。
  2. 您可以覆盖Train 模型上的save() 方法。
  3. 您可以使用自定义save_model() method 创建ModelAdmin 子类。

如果您想确保在不创建关联的Seat 实例的情况下无法创建Train,请覆盖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() 方法。

【讨论】:

    【解决方案2】:

    您可以覆盖模型的保存方法或在训练模型上使用 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-20
      • 1970-01-01
      相关资源
      最近更新 更多