【发布时间】: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方法移到类外。