首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Django -重写Model.create()方法?

Django -重写Model.create()方法?
EN

Stack Overflow用户
提问于 2010-02-22 07:39:05
回答 7查看 78.2K关注 0票数 96

Django docs仅列出了覆盖save()delete()的示例。但是,只有在创建时,我才想为我的模型定义一些额外的处理。对于任何熟悉Rails的人来说,这等同于创建一个:before_create过滤器。这个是可能的吗?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-02-22 22:35:39

重写__init__()将导致在实例化object的python表示时执行代码。我不知道rails,但在我看来,:before_created过滤器就像是在数据库中创建对象时要执行的代码。如果要在数据库中创建新对象时执行代码,则应重写save(),检查该对象是否具有pk属性。代码将如下所示:

代码语言:javascript
运行
复制
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)
票数 183
EN

Stack Overflow用户

发布于 2017-08-11 22:36:25

这是旧的,有一个公认的答案是有效的(扎克的),也有一个更地道的(迈克尔·比尔斯特拉的),但由于它仍然是大多数人在谷歌上看到的第一个结果,我认为我们需要一个更多的最佳实践的现代风格的答案在这里

代码语言:javascript
运行
复制
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)

重点是:

  1. use signals (阅读更多here in the official docs)
  2. use一个用于良好命名空间的方法(如果它有意义的话) ...and我将其标记为@classmethod而不是@staticmethod,因为您最终很可能需要在代码

中引用静态类成员

如果核心Django有一个实际的post_create信号,那就更干净了。(如果你需要传递一个布尔参数来改变一个方法的行为,那应该是2个方法。)

票数 34
EN

Stack Overflow用户

发布于 2012-09-27 14:26:53

如何创建post_save信号的示例(来自http://djangosnippets.org/snippets/500/)

代码语言:javascript
运行
复制
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来完成这项任务更健壮,更容易阅读,但也更长。

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2307943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档