【问题标题】:Django signal not printing message in terminalDjango 信号不在终端中打印消息
【发布时间】:2020-06-08 01:48:21
【问题描述】:

我正在尝试了解这些信号并将其用于我的应用程序中。但是,即使包含此信号并没有给我任何错误消息,并且在 Django 管理面板中,我实际上可以成功添加电影,但当这种情况发生时,我看不到终端上打印的消息“电影已创建”。任何人都可以看到为什么?非常感谢您的帮助!

模型.py ...

from django.db.models.signals import post_save


class Movie(models.Model):
    name = models.CharField(max_length=30)
    description = models.TextField(blank=True)
    rating = models.IntegerField(default=0, blank=True, null=True)
    class MovieGenre(models.TextChoices):
        Action = 'Action'
        Horror = 'Horror'
        History = 'History'
        New = 'New'

    genre = MultiSelectField(
        choices=MovieGenre.choices,
        max_choices=3,
        min_choices=1
    )

    def average_rating(self):
        rating = self.movierate_set.aggregate(Avg('rating'))['rating__avg']
        return rating

    class Meta:
        ordering = ["-upload_date"]

    def __str__(self):
        return self.name

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

        if created:
                Movie.objects.create(name=instance)
                print('movie created')

        post_save.connect(create_movie, sender=Movie)

【问题讨论】:

  • 你能不能把 post_save.connect(create_movie, sender=Movie) 这部分移到外层缩进,即在课堂外试试
  • 请检查文件中的缩进。 create_movie 方法不应该是Movie 类的一部分,post_save.connect() 行不应该在create_movie 函数中。建议将post_save.connect(...) 调用放在signals.py 中,并将其导入ready() 方法中。请参阅this answer 了解更多信息。
  • 通过连接信号,create_movie 函数将在电影保存后运行 - 在该函数中调用 Movie.objects.create(...) 没有任何意义 - 这将尝试创建另一部电影.
  • @Adaikalaraj 感谢您的回复。当我这样做时,它在我的终端中显示“NameError:名称'create_movie'未定义”
  • 是的,你需要把create_movie方法移到类外。

标签: django model signals


【解决方案1】:

我认为推荐的信号使用方式如下:

  • 您在应用程序中创建一个signals.py 文件
  • 在您的 app.py 文件中,在您的 appconfig 类中,您可以在 ready 方法中导入信号

下面是我创建的一个示例,用于在创建 USER 实例时创建一个 PROFILE 实例

# signals.py

from django.contrib.auth.models import User
from django.db.models.signals import post_save
from django.dispatch import receiver
from .models import UserProfile


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    """Automatically creates a UserProfile instance whenever a User is created"""
    if created:
        UserProfile.objects.create(user=instance)
# app.py
class UsersConfig(AppConfig):
    name = 'api.users'
    label = 'api.users'

    def ready(self):
        import api.users.signals

希望对你有帮助

【讨论】:

  • 旁注:像bulk_create这样的一些动作在保存对象时不会触发.save()方法,反过来也不会触发信号。小心点。如果必须绝对触发信号,您可以停用模型上的 bulk_create 方法,或找到解决方法
猜你喜欢
  • 2013-11-25
  • 2013-04-15
  • 1970-01-01
  • 2014-11-07
  • 2010-11-23
  • 2015-01-03
  • 2021-10-08
  • 1970-01-01
相关资源
最近更新 更多