django - django信号,如何使用“实例”

标签 django signals instance

我正在尝试创建一个系统,该系统使用户可以上传zip文件,然后使用post_save信号将其提取。

class Project:
    ....
    file_zip=FileField(upload_to='projects/%Y/%m/%d')

@receiver(post_save, sender=Project)
def unzip_and_process(sender, **kwargs):
    #project_zip = FieldFile.open(file_zip, mode='rb')
    file_path = sender.instance.file_zip.path
    with zipfile.ZipFile(file_path, 'r') as project_zip:
        project_zip.extractall(re.search('[^\s]+(?=\.zip)', file_path).group(0))
        project_zip.close()


当提供正确的文件路径时,unzip_and_process方法可以正常工作(在这种情况下,我需要提供instance.file_zip.path。但是,我无法获取/设置带有信号的实例。有关信号的Django文档尚不清楚,并且没有例子,那我该怎么办?

最佳答案

实际上,Django's documentation about signals非常清楚,并包含示例。

在您的情况下,post_save信号发送以下参数:sender(模型类),instance(类sender的实例),createdrawusing。如果需要访问instance,则可以在示例中使用kwargs['instance']对其进行访问,或者更好的是,更改回调函数以接受参数:

@receiver(post_save, sender=Project)
def unzip_and_process(sender, instance, created, raw, using, **kwargs):
    # Now *instance* is the instance you want
    # ...

关于django - django信号,如何使用“实例”,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6992208/

相关文章:

django - 如何防止 Django 的响应框架剥离文本文件的换行符?

捕获 SIGINT 信号以终止自定义 shell

c++ - 错误 C2440 : 'initializing' : cannot convert from 'classname *' to 'classname'

java - 使用 JAXB 生成随机实例

javascript - 在整个文档中格式化整数千位分隔符

python - MySQLdb connection.py "cant connect"与 Django

c - sigset_t 在这种情况下有用吗?

java - 如何动态生成实例名称?

django - 不可散列类型 : 'list' error when trying to add m2m relationships dynamically using post_save in Django

c++ - 为什么当我按 CTRL+C 时 mingw-w64 mintty 不 signal() 我的程序?