gpt4 book ai didi

django - 您可以通过 django rest 框架在部分更新 django 对象时触发信号吗?

转载 作者:行者123 更新时间:2023-12-04 04:12:32 31 4
gpt4 key购买 nike

我开始注意到 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

但它很hacky

最佳答案

在你的应用程序目录中应该有一个apps.pysee the docs for the format它的。

通常它最终看起来像下面这样,而不是他们手动连接信号的例子。请注意,我这里有一个“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 中的行,并在应用配置中使用 name。我不确定它们实际上有多重要

关于django - 您可以通过 django rest 框架在部分更新 django 对象时触发信号吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61485519/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com