我正在构建一个Django应用程序,它使用公式表保存通过的.stl文件,我的目标是打开文件,用已经测试过的脚本提取一些信息,并将这些信息保存在与文件相同的寄存器中。
我正在这样做:
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文件,而是公式的一个元素。
然后,我使用一个表单:
class PieceForm(forms.ModelForm):
"""Pieces model form."""
class Meta:
"""Form settings."""
model = Piece
fields = ('file')如何传递文件而不传递路由?
发布于 2019-12-04 00:58:01
Piece.file不是路径,它是一个models.FileField。要获取路径,您必须使用self.file.path。
请注意,如果该字段实际上没有文件,self.file.path将引发一个异常(ValueError,“文件属性没有与之关联的文件”),因此最好在测试之前进行测试。models.FileField在布尔上下文中有一个false值,因此您需要:
if self.file:
self.information = informationGeneration(self.file.path)以下是一些注意事项:
1/ a函数是一个操作,所以它的名称应该是动词(即"extract_informations")
2/您可能不希望每次保存对象时都重新解析文件的内容,只在文件发生更改时才重新解析。您可以使用md5sum (存储在模型中)来检查这一点。
3/我没有仔细检查,但我真的认为您不应该对此字段使用默认值-如果您想将其设置为可选,请使用blank=True和null=True。
https://stackoverflow.com/questions/59160810
复制相似问题