(使用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()
?
答案 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
来保存对象的最终状态。