Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.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
在通过django rest框架对django对象进行部分更新时,能否触发一个信号?_Django_Django Rest Framework - Fatal编程技术网

在通过django rest框架对django对象进行部分更新时,能否触发一个信号?

在通过django rest框架对django对象进行部分更新时,能否触发一个信号?,django,django-rest-framework,Django,Django Rest Framework,我开始注意到django rest框架中的patch方法实际上并没有触发信号,post方法似乎工作正常。这就是我所拥有的: @receiver(signals.pre_save, sender=Example) def populate_time_fields_based_on_state(sender, **kwargs): example = kwargs.get('instance') if example.start_datetime is None and exampl

我开始注意到django rest框架中的
patch
方法实际上并没有触发信号,
post
方法似乎工作正常。这就是我所拥有的:

@receiver(signals.pre_save, sender=Example)
def populate_time_fields_based_on_state(sender, **kwargs):
    example = kwargs.get('instance')
    if example.start_datetime is None and example.projected_end_datetime is None and example.state.label == 'Assigned':
        example.start_datetime = datetime.datetime.now()
        example.projected_end_datetime = example.created_datetime + datetime.timedelta(
            days=example.som_field)
        example.save()
我通过以下方式对此进行测试:

client = APIClient()
client.patch(f'/api/example/1/', {'state': 'Assigned'})
有没有办法让它触发信号?我是否需要重写序列化程序中的更新方法?我正在尝试这个:

def partial_update(self, request, *args, **kwargs):
    response = super().partial_update(request, *args, **kwargs)
    instance = self.get_object()
    instance.save()
    return response

但是它很黑

在你的应用程序目录中应该有一个
apps.py

通常情况下,其结果如下所示,与他们手动连接信号的示例相反。请注意,我这里有一个“project/apps/”结构,但只需根据文件的实际位置更改模块名称即可:

#project/apps/my_app/__init__.py
default_app_config = 'project.apps.my_app.apps.MyAppConfig'

#project/apps/my_app/apps.py
from django.apps import AppConfig

class MyAppConfig(AppConfig):
    name = "project.apps.my_app"
    verbose_name = "MyApp"

    def ready(self):
        from project.apps.my_app import signals
        # ... other init &/or logging

注意:可以随意删除init.py中的行,并在应用程序配置中使用
名称。我不确定它们实际上有多重要

接收器是否被激活(通常通过导入应用程序内就绪)?你能通过在django控制台中保存一个对象来确认调用它吗?Seconding@Ken4scholars。我有很多前/后保存挂钩,对它们的启动没有问题,它们是应用程序不可或缺的一部分。在我的
app name/apps.py
方法的
ready
中,我有类似于
import app\u name.signals
的东西,其中
signals.py
定义了它们。我在一个模型文件中导入了一个旧的信号,效果很好。最后,在信号文件中添加一个
print('here')
,当运行manage.py时,如果导入了lalso,则应将其打印出来,而无需重写。基本序列化程序的update()方法正常调用instance.save(),因此实际上您所拥有的是相同的。啊@AndrewBacker我认为这是我的问题,信号没有导入到主应用程序中。您通常将所有信号导入哪里?我可以将它们导入模型文件。