温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - Pass save parameter through Django create method
django django-models

其他 - 通过Django create方法传递保存参数

发布于 2020-03-29 12:52:27

假设我有以下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'

查看更多

查看更多

提问者
Johnny Metz
被浏览
21
Pablo Albornoz 2020-01-31 05:33

您可以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