Django - 模型中的自定义保存方法

时间:2017-09-12 15:03:24

标签: django

(使用Django 1.11.5)

传统上,我总是创建一个这样的模型:

class Animal(models.Model):
    is_hungry = models.BooleanField(default=True)

然后进行更改:

animal = Animal()
animal.save()

animal.is_hungry = True
animal.save()

最近,我看到一位朋友使用自定义保存方法定义模型:

class Animal(models.Model):
    is_hungry = models.BooleanField(default=True)

    def feed_animal(self):
        self.is_hungry = False
        self.save()

调用此方法似乎按预期工作:

>>> from testapp.models import Animal
>>> a = Animal()
>>> a.save()
>>> a.is_hungry
True
>>>
>>> a.feed_animal()
>>> a.is_hungry
False

在模型定义中定义这样的自定义保存方法有什么好处/缺点吗?是否有理由更喜欢直接在对象上调用.save()

2 个答案:

答案 0 :(得分:5)

没有任何缺点,但将隐式保存隐藏在模型方法中可能不是最佳做法。定义只修改模型对象状态的feed_animal方法并将保存保留到view.py代码更清晰:

# model.py
class Animal(models.Model):
    is_hungry = models.BooleanField(default=True)

    def feed_animal(self):
        # makes sense if ther's more to it than just setting the attribute
        self.is_hungry = False

# view.py
a = Animal()
a.feed_animal()
a.save()

定义自定义保存方法的模式在Django中被理解为覆盖子类中Model类的保存方法,如果需要在保存时永久更改对象行为,则有意义:

# model.py
class Animal(models.Model):
    is_hungry = models.BooleanField(default=True)

    def feed_animal(self):
        # makes sense if ther's more to it than just setting the attribute
        self.is_hungry = False

    # let say we need to save only well fed animals
    def save(self, *args, **kwargs):
        self.feed_animal()        
        super(Model, self).save(*args, **kwargs)

答案 1 :(得分:1)

这取决于您的使用案例。

在上面给出的例子中,如果饲喂动物,它最终会导致动物(物体)不饿。因此,在设置feed_animal之后的self.is_hungry函数中(其中self是对象本身),调用self.save来保存对象的最终状态。