Django docs仅列出了覆盖save()和delete()的示例。但是,只有在创建时,我才想为我的模型定义一些额外的处理。对于任何熟悉Rails的人来说,这等同于创建一个:before_create过滤器。这个是可能的吗?
发布于 2010-02-22 22:35:39
重写__init__()将导致在实例化object的python表示时执行代码。我不知道rails,但在我看来,:before_created过滤器就像是在数据库中创建对象时要执行的代码。如果要在数据库中创建新对象时执行代码,则应重写save(),检查该对象是否具有pk属性。代码将如下所示:
def save(self, *args, **kwargs):
if not self.pk:
# This code only happens if the objects is
# not in the database yet. Otherwise it would
# have pk
super(MyModel, self).save(*args, **kwargs)发布于 2017-08-11 22:36:25
这是旧的,有一个公认的答案是有效的(扎克的),也有一个更地道的(迈克尔·比尔斯特拉的),但由于它仍然是大多数人在谷歌上看到的第一个结果,我认为我们需要一个更多的最佳实践的现代风格的答案在这里
from django.db.models.signals import post_save
class MyModel(models.Model):
# ...
@classmethod
def post_create(cls, sender, instance, created, *args, **kwargs):
if not created:
return
# ...what needs to happen on create
post_save.connect(MyModel.post_create, sender=MyModel)重点是:
@classmethod而不是@staticmethod,因为您最终很可能需要在代码中引用静态类成员
如果核心Django有一个实际的post_create信号,那就更干净了。(如果你需要传递一个布尔参数来改变一个方法的行为,那应该是2个方法。)
发布于 2012-09-27 14:26:53
如何创建post_save信号的示例(来自http://djangosnippets.org/snippets/500/)
from django.db.models.signals import post_save
from django.dispatch import receiver
@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
"""Create a matching profile whenever a user object is created."""
if created:
profile, new = UserProfile.objects.get_or_create(user=instance)这里有一个深思熟虑的讨论,关于使用信号还是自定义保存方法https://web.archive.org/web/20120815022107/http://www.martin-geber.com/thought/2007/10/29/django-signals-vs-custom-save-method/是最好的
在我看来,使用signals来完成这项任务更健壮,更容易阅读,但也更长。
https://stackoverflow.com/questions/2307943
复制相似问题