Python 连接到pre_delete信号后未调用Django信号接收器 目标
我试图实现一个投票系统,跟踪用户何时对数据库中的特定对象进行投票。我使用一个中间的Python 连接到pre_delete信号后未调用Django信号接收器 目标,python,django,signals,Python,Django,Signals,我试图实现一个投票系统,跟踪用户何时对数据库中的特定对象进行投票。我使用一个中间的UserVote模型来跟踪它,该模型带有一个外键,指向实际包含所有投票的对象。每当删除UserVote时,我想删除相关对象上的投票 我试过的 ,我想通过收听pre_delete信号来完成上述操作 当我使用Django测试运行程序测试下面的接收器函数时,一切都按照预期进行 from myapp.models.users import UserVote from django.db.models.signals imp
UserVote
模型来跟踪它,该模型带有一个外键,指向实际包含所有投票的对象。每当删除UserVote
时,我想删除相关对象上的投票
我试过的
,我想通过收听pre_delete
信号来完成上述操作
当我使用Django测试运行程序测试下面的接收器函数时,一切都按照预期进行
from myapp.models.users import UserVote
from django.db.models.signals import pre_delete
from django.dispatch import receiver
@receiver(pre_delete)
def user_vote_handler(sender, instance, **kwargs):
if sender in UserVote.__subclasses__():
# remove the vote from the related model
问题
当我在views.py中对模型实例调用delete()
时,不会调用该函数。如果我像下面那样向receiver函数添加print语句,则不会打印任何语句
from myapp.models.users import UserVote
from django.db.models.signals import pre_delete
from django.dispatch import receiver
@receiver(pre_delete)
def user_vote_handler(sender, instance, **kwargs):
print('function called')
if sender in UserVote.__subclasses__():
print('condition met')
# remove the vote from the related model
我已经通读了一遍,还没有找到问题的根源。我已经将接收器功能放在myapp.signals
和myapp.models.users
中,其行为是相同的。我有一种感觉,我做了一件愚蠢的事,却没有意识到。有人能解释一下到底出了什么问题吗?我正在使用Django 2.2
代码
在您的app app.py文件中,为信号添加导入应该如下所示
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
在settings.py中,你应该像这样添加你的应用程序
'users.apps.UsersConfig',
这应该会触发pre_delete信号,:D我花了整整一天的时间认为我做错了什么,但实际上我忘记了这两个lol哇,我很笨,实际上在中有一个关于ready函数的注释。对于任何测试您的信号的人,请确保
# models.users.py
...
class User(AbstractUser):
pass
class UserVote(models.Model):
"""shared fields and functions for UserVote models"""
class Meta:
abstract = True
DOWN_VOTE = 'DOWN'
UP_VOTE = 'UP'
VOTE_CHOICES = [
(DOWN_VOTE, 'Down vote'),
(UP_VOTE, 'Up vote'),
]
user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
vote = models.CharField(choices=VOTE_CHOICES, default=UP_VOTE, max_length=255)
...
# methods to handle voting
...
class ForumCommentUserVote(UserVote):
forum_comment = models.ForeignKey('myapp.ForumComment', on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(fields=['forum_comment', 'user'], name='unique_author_tag_assignment_user_vote')
]
...
# some more methods
...
...
# more UserVote subclasses
...
class UsersConfig(AppConfig):
name = 'users'
def ready(self):
import users.signals
'users.apps.UsersConfig',