Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 连接到pre_delete信号后未调用Django信号接收器 目标_Python_Django_Signals - Fatal编程技术网

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',