【问题标题】:django post_save call from within sending Model?来自发送模型的 django post_save 调用?
【发布时间】:2012-06-04 07:53:58
【问题描述】:

我有一个非常简单的模型:

class Badge(models.Model):

    name = models.CharField(max_length=16, help_text="Name for Badge")
    category = models.ForeignKey(BadgeCategory, help_text="Category for badge")
    description = models.CharField(max_length=32, help_text="A brief description")
    file = models.ImageField(upload_to=format_badge_name)

    signals.post_save.connect(create_badge, sender=Badge)

我知道我在 signals.py 中的 create_badge 函数有效。如果我在没有发送者值的情况下发送它,它表示发送者是一个 LogEntry 对象。我想/需要在 post_save 脚本中引用一些实例信息,如下所示:

def create_badge(sender, instance, created, **kwargs):

    from userinfuser.ui_api import UserInfuser
    from django.conf import settings

    if created:
        api_key = settings.API_KEY
        api_email = settings.API_EMAIL

        ui = UserInfuser(api_email, api_key)
        ui.create_badge(instance.category.name, instance.name, instance.description, instance.file.url)

我在哪里可以调用我的 post_save 调用,以便它知道徽章(我假设这是修复?

谢谢。

【问题讨论】:

  • 到底是什么问题?如果没有像 signals.post_save.connect(create_badge, sender=Badge) 那样指定 sender,所有 model.save() 调用都会导致 create_badge() 被调用

标签: python django django-models django-signals


【解决方案1】:

只需将信号与 sender=Badge 定义后连接信号,测试示例:

from django.db import models
from django.db.models import signals

def create_badge(sender, instance, created, **kwargs):
    print "Post save emited for", instance

class BadgeCategory(models.Model):
    name = models.CharField(max_length=100)

class Badge(models.Model):

    name = models.CharField(max_length=16, help_text="Name for Badge")
    category = models.ForeignKey(BadgeCategory, help_text="Category for badge")
    description = models.CharField(max_length=32, help_text="A brief description")

signals.post_save.connect(create_badge, sender=Badge)

测试 shell 会话:

In [1]: category = BadgeCategory(name='foo')

In [2]: category.save()

In [3]: badge = Badge(category=category, name='bar', description='test badge')

In [4]: badge.save()
Post save emited for Badge object

【讨论】:

  • 我试过了,虽然它没有出错,但它显然也没有调用信号。是否可以从 init 内部调用所有这些?
  • 我被你的词汇弄糊涂了。您不会调用信号:您要么将其连接到接收器,要么发射它(这将调用 所有连接的接收器)。无论如何,我在答案中添加了一个经过测试/工作的示例。
  • 我确信混乱是由于我缺乏正式的知识(尤其是信号)。如果我将 signal.post_save.connect 命令放在它被调用的 Model 类中,但我会遇到依赖问题(Badge 在 Badge 中未定义)。我唯一的另一个例子与用户配置文件有关,发件人是用户模型,所以我以前没有遇到过这个。如果我将 signals.post_save.connect 命令放在 Badge 模型之外,它似乎根本不会被调用。
  • 你一直都是对的。我在传递给接收器的变量中有一个简单的错误。
猜你喜欢
  • 2020-11-29
  • 2020-09-28
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2017-03-05
  • 2017-10-10
  • 1970-01-01
  • 2012-05-31
相关资源
最近更新 更多