【问题标题】:Add operation to save method of abstract save method of parent model in DjangoDjango中父模型抽象保存方法的保存方法添加操作
【发布时间】:2020-06-29 11:58:49
【问题描述】:

我创建基本模型并在我的所有模型中继承它。这是我的BaseModel

class BaseModel(models.Model):
    create_date = models.DateTimeField(auto_now_add=True)
    update_date = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey('UserManager.User', default=1, on_delete=models.SET_DEFAULT,related_name='created_%(class)ss')
    updated_by = models.ForeignKey('UserManager.User', default=1, on_delete=models.SET_DEFAULT,related_name='updated_%(class)ss')

    class Meta:
        abstract = True
        ordering = ['create_date']

    def save(self, *args, **kwargs):
        self.user = kwargs.pop('user', None)
        if self.user:
            if self.user.pk is None:
                self.created_by = self.user
            self.updated_by = self.user
        super(BaseModel, self).save(*args, **kwargs)

现在,我想向其中一个子模型的save 方法添加一些操作,如下所示:

class Child(BaseModel):
    # Some fields go here. 
    def save(self, *args, **kwargs):
        # Some operations must run here. 

但是子模型的save方法不再运行了!
如何使用子模型的保存方法和abastract=True模型的保存方法?

【问题讨论】:

  • 请仅使用版本标签,例如django-3.0 如果您的问题专门针对该版本,并且答案不适用于其他(较早或较晚)Django 版本,例如版本迁移问题。

标签: python django django-models django-inheritance


【解决方案1】:

如果你从 BaseModel 继承 ChildModel,当你到达 BaseModel 中的保存方法时,'self.class' 仍然是 ChildModel。于是找到了Child的super,也就是BaseModel,于是调用了BaseModel中的save。

所以只要打电话,

super(ChildModel, self).save(*args, **kwargs)

【讨论】:

  • 我不想改变BaseModelsave 方法。我只想在子模型的save 方法中添加一些东西。 @mohit-harshan
  • 好的,然后只需在抽象模型中执行 save() 方法并调用 super(BaseModel, self).save(*args, **kwargs) itwself 。它将仅引用子模型保存
  • ty @mohit-harshan
猜你喜欢
  • 2012-11-06
  • 2019-03-04
  • 1970-01-01
  • 2021-05-14
  • 1970-01-01
  • 2018-11-22
  • 1970-01-01
  • 2015-02-24
  • 2015-10-13
相关资源
最近更新 更多