Django重写model的增删查改方法

重写model的增删查改方法:

class MyModel(model.Model):
    def save(self, *args, **kwargs):
        if not self.pk:
        # 增
        else:
        # 改
        return super(MyModel, self).save(*args, **kwargs)

    def delete(self):
        # 删 该方法在admin中批量删除时不可用 至针对单个instant删除
        return super(MyModel, self).delete()

如果需要实现批量删除需要重写默认的Manager:

# multiple delete
class FilesManager(models.QuerySet):
    def delete(self, *args, **kwargs):
        for obj in self:
            obj.file.delete()
        super(FilesManager, self).delete(*args, **kwargs)


class MyModel(model.Model):
    # change default manager to FilesManager
    objects = FilesManager.as_manager()

    def save(self, *args, **kwargs):
        if not self.pk:
        # 增
        else:
        # 改
        return super(MyModel, self).save(*args, **kwargs)

    def delete(self):
        # 删 该方法在admin中批量删除时不可用 至针对单个instant删除
        return super(MyModel, self).delete()

判断字段被改动的两种方法

方法1:

class MyModel(models.Model):
    f1 = models.CharField(max_length=1)

    def save(self, *args, **kw):
        if self.pk is not None:
            this = MyModel.objects.get(pk=self.pk)
            if this.f1 != self.f1:                print 'f1 changed'
        super(MyModel, self).save(*args, **kw)

方法2:

class Person(models.Model):
  name = models.CharField()

  __original_name = None

  def __init__(self, *args, **kwargs):
    super(Person, self).__init__(*args, **kwargs)
    self.__original_name = self.name

  def save(self, force_insert=False, force_update=False, *args, **kwargs):
    if self.name != self.__original_name:
      # name changed - do something here

    super(Person, self).save(force_insert, force_update, *args, **kwargs)
    self.__original_name = self.name