首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django models.py中的文件操作

Django models.py中的文件操作
EN

Stack Overflow用户
提问于 2019-12-03 23:53:03
回答 1查看 127关注 0票数 0

我正在构建一个Django应用程序,它使用公式表保存通过的.stl文件,我的目标是打开文件,用已经测试过的脚本提取一些信息,并将这些信息保存在与文件相同的寄存器中。

我正在这样做:

代码语言:javascript
复制
from stl import mesh # numpy-stl library
def informationGeneration(stl_route, *args, **kwargs):
    # scripts that generates the information 
    myMesh = mesh.Mesh.from_file(stl_route) # here the error appears
    return myMesh.areas.shape[0]

class Piece(models.Model):
    """Piece model."""
    # ...
    file = models.FileField(upload_to='pieces/files', default='NA')
    # ...
    information = models.IntegerField(default=0)

    def save(self, *args, **kwargs):
        """Overriding the save method."""
        self.information = informationGeneration(self.file)
        super().save(*args, **kwargs)
    def __str__(self):
        # ...

问题是,当我尝试保存一个新实例时,.stl -stl检测到一个错误,self.file不是numpy文件,而是公式的一个元素。

然后,我使用一个表单:

代码语言:javascript
复制
class PieceForm(forms.ModelForm):
    """Pieces model form."""
    class Meta:
       """Form settings."""
       model = Piece
       fields = ('file')

如何传递文件而不传递路由?

EN

回答 1

Stack Overflow用户

发布于 2019-12-04 00:58:01

Piece.file不是路径,它是一个models.FileField。要获取路径,您必须使用self.file.path

请注意,如果该字段实际上没有文件,self.file.path将引发一个异常(ValueError,“文件属性没有与之关联的文件”),因此最好在测试之前进行测试。models.FileField在布尔上下文中有一个false值,因此您需要:

代码语言:javascript
复制
if self.file:
    self.information = informationGeneration(self.file.path)

以下是一些注意事项:

1/ a函数是一个操作,所以它的名称应该是动词(即"extract_informations")

2/您可能不希望每次保存对象时都重新解析文件的内容,只在文件发生更改时才重新解析。您可以使用md5sum (存储在模型中)来检查这一点。

3/我没有仔细检查,但我真的认为您不应该对此字段使用默认值-如果您想将其设置为可选,请使用blank=Truenull=True

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59160810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档