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