gpt4 book ai didi

django - 在文件上传和模型保存之前 Hook

转载 作者:行者123 更新时间:2023-12-01 15:11:32 25 4
gpt4 key购买 nike

我是 django 的新手,尝试实现一个允许用户上传文件、解析文件并将包含的信息输入同一模型的项目:

class Track(models.Model):  
Gpxfile = models.FileField("GPS XML", upload_to="tracks/gps/")
date=models.DateTimeField(blank=True)
waypoints = models.ForeignKey(Waypoint)
...

首先,我可以使用管理界面并保存工作。所以我加入了模型的 save() 方法:

def save(self, *args, **kwargs):
"""we hook to analyse the XML files"""
super(Track, self).save(*args, **kwargs) #get the GPX file saved first
self.__parseGPSfile(self.Gpsxmlfile.path) #then analyse it

但是在这里我遇到了由于依赖性导致的问题:

  • 要将文件字段保存到真实文件中,我需要先调用原始的 save()
    • 这会中断,因为一些字段还没有填充,因为我没有填充
  • 如果我切换两行,文件还没有保存并且不能被解析

也许我只是缺乏基本知识,但即使在阅读了大量 SO、博客和谷歌搜索之后,我也不清楚如何解决它。我刚刚发现这个想法似乎不太适合:

  • 创建您自己的 View 并将其连接到您的处理程序 (see here)
    • 不好,因为这不适用于管理界面,需要 View ,将逻辑放入 View 等...
  • 为文件字段使用验证器 ( see here )
    • 不确定这是否是一个好的设计,因为它是关于一般的文件处理而不是真正的验证(还)

那么社区建议如何在 Django 1.4 中实现文件后处理和数据“导入”?

最佳答案

您可以在保存之前解析文件,通常我喜欢在模型 clean() 方法中这样做:

def clean(self):
file_contents = self.Gpxfile.read()
...do stuff

如果文件不符合您的验证标准,您可以在 clean 中引发 ValidationError,这将传播回调用 View ,以便您可以将表单错误报告给用户。

如果你真的需要先保存文件然后再做一些事情,你可以使用一个post_save信号

def some_function_not_in_the_model(sender, **kwargs):
obj = kwargs['instance']
...do stuff with the object

# connect function to post_save
post_save.connect(some_function_not_in_the_model, sender=Track)

Django docs on post_save

最后,关于大文件的一个注意事项是它们最终可能作为服务器上的临时文件(在 Linux 中/var/tmp 或类似的...这可以在 settings.py 中设置)。尝试访问文件时,在 clean() 方法中进行检查可能是个好主意,例如:

# check if file is temporary
if hasattr(self.Gpxfile.file, 'temporary_file_path'):
try:
file_path = self.Gpxfile.file.temporary_file_path(),
except:
raise ValidationError(
"Something bad happened"
)
else:
contents = self.Gpxfile.read()

哦,最后,要小心关闭临时文件。当我开始使用 Django 的 FileField 并了解临时文件的工作原理时,我认为我会成为一名优秀的程序员并在我使用完它后关闭该文件。这会导致问题,因为 Django 会在内部执行此操作。同样,如果您打开临时文件并引发 ValidationError,您可能希望删除(取消链接)临时文件以防止它们在临时目录中累积。

希望这对您有所帮助!

关于django - 在文件上传和模型保存之前 Hook ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22962431/

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