gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:34:01 25 4
gpt4 key购买 nike

(使用 Django 1.11.5)

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

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

然后进行如下更改:

animal = Animal()
animal.save()

animal.is_hungry = True
animal.save()

最近,我看到一个 friend 用自定义保存方法定义了一个模型:

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()直接作用在物体上?

最佳答案

没有缺点,但将隐式保存埋入模型方法可能不是最佳实践。定义 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)

关于Django - 模型中的自定义保存方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46179804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com