上传后自动保存ImageField中的图像列表-django 3

上传后自动保存ImageField中的图像列表-django 3,django,image,Django,Image,与Django 3合作,我有以下模型: class Case(models.Model): slug = ShortUUIDField(max_length=3) title = models.CharField(max_length=50) #.... ct = models.FileField(upload_to='files/') class ModelImages(models.Model): case = models.ForeignKey(C

与Django 3合作,我有以下模型

class Case(models.Model):
    slug = ShortUUIDField(max_length=3)
    title = models.CharField(max_length=50)
    #....
    ct = models.FileField(upload_to='files/')

class ModelImages(models.Model):
    case = models.ForeignKey(Case, on_delete=models.CASCADE,
                              related_name="slices_images")
    img = models.ImageField(upload_to='images/', editable=False)
    #....
    position = models.PositiveSmallIntegerField(editable=False)
一旦上传了“ct”(3D图像)(这非常有效),我想提取“ct”的切片并将其保存为“ModelImages”类中的图像

我使用一个名为“获取切片(ct)”的函数提取图像

每个“ct”的图像有数百张

这应该是全自动的


我该怎么做呢?

这是我给你的建议。使用保存后信号,该信号将在保存后“自动”处理案例对象的3D图像

从django.db.models.signals导入后保存
课堂案例(models.Model):
段塞=短UUIDField(最大长度=3)
title=models.CharField(最大长度=50)
#....
ct=models.FileField(上传到class='files/')
类ModelImages(models.Model):
case=models.ForeignKey(case,on_delete=models.CASCADE,
相关的\u name=“切片\u图像”)
img=models.ImageField(上传到='images/',可编辑=False)
#....
位置=型号。阳性AllintegerField(可编辑=假)
#这将在保存案例对象后随时运行。
def处理_3d_图像(发送方、实例、已创建,**kwargs):
#这仅在第一次保存(创建)时运行
如果创建:
#如果get_切片正在创建和保存ModelImages对象,则可以传递
#外键的实例(即Case对象)。
获取_切片(instance.ct)
post\u save.connect(处理\u 3d\u图像,发送方=案例)
当心!这将是一个同步任务,意味着django将在返回响应之前等待此处理完成。鉴于有数百张图片,这可能需要一段时间




附笔。。 我的第二个建议是通过使用异步任务管理器来避免这种情况,例如

如果您成功设置芹菜,您可以创建一个异步任务,用于保存
ct
中的图像,该任务将在后台完成,而不会阻塞django应用程序

tasks.py

从导入获取切片
@app.task()
def处理\u 3d\u图像\u异步(案例\u ct):
获取\u切片(案例\u ct)
如果使用芹菜,则修改了
post_save
功能

from.tasks导入进程\u 3d\u图像\u异步
#无论何时保存案例对象,都将运行此操作。
def处理_3d_图像(发送方、实例、已创建,**kwargs):
#这仅在第一次保存(创建)时运行
如果创建:
处理\u 3d\u图像\u异步延迟(case\u ct=instance.ct)
最后一点要注意的是,如果异步执行此操作,您将需要知道
案例
对象的文件是否已完成处理,因此我的最后一个建议是向案例模型添加一个默认值为False的BooleanField列,然后在切片后的异步任务中将其设置为true


然而,使用芹菜只是一个建议

谢谢你的帮助,我欠你很多啤酒!目前我正在使用synchr。方法,但我要试试芹菜。仅供参考,为了保存模型图像,我必须对transaction.atomic()使用