假设我有以下Django模型,该模型覆盖了save方法:
class Person(models.Model):
name = models.CharField(max_length=50)
def save(self, lock=False, *args, **kwargs):
if lock:
print("LOCKING OBJECT...")
super().save(*args, **kwargs)
我知道我可以创建一个人并传递lock
给save方法,如下所示:
steve = Person(name="Steve")
steve.save(lock=True)
# LOCKING OBJECT...
但是,我真的很喜欢使用该create
方法,因为它更具可读性:
Person.objects.create(name="Michelle")
如何lock
使用后一种方法通过?以下内容不起作用:
Person.objects.create(name="Michelle", lock=True)
# TypeError: Person() got an unexpected keyword argument 'lock'
您可以objects
通过为模型创建自定义管理器来向“人”管理器(对象)添加其他方法:
class PersonManager(models.Manager):
def create_person(*args, **kwargs):
lock = kwargs.pop('lock', False)
new_person = self.model(**kwargs)
new_person.save(lock=lock)
return new_person
然后将该新经理添加到您的模型中:
class Person(models.Model):
name = models.CharField(max_length=50)
objects = PersonManager() #Here!
def save(self, lock=False, *args, **kwargs):
if lock:
print("LOCKING OBJECT...")
super().save(*args, **kwargs)
现在你可以打电话
Person.objects.create_person(name='Pablo', lock=True)
您也可以覆盖函数名称,create
但这可能会产生意想不到的效果,所以我不会。
请注意,这是Django应用中的常见模式,例如Auth
我同意这个答案,因为其他解决方案将需要覆盖create方法-引入的问题可能超出解决的范围。