[英]File manipulation in Django models.py
我正在構建一個 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):
# ...
問題是當我嘗試保存新實例時,numpy-stl 檢測到錯誤, self.file
不是 .stl 文件,是處方集的一個元素。
然后,我使用一個表格:
class PieceForm(forms.ModelForm):
"""Pieces model form."""
class Meta:
"""Form settings."""
model = Piece
fields = ('file')
如何傳遞文件而不是路由?
Piece.file
不是路徑,而是models.FileField
。 要獲取路徑,您必須使用self.file.path
。
請注意,如果該字段實際上沒有文件,則self.file.path
將引發異常(ValueError,“文件屬性沒有與之關聯的文件”),因此最好先進行測試。 models.FileField
在布爾上下文中有一個 false 值,所以你想要:
if self.file:
self.information = informationGeneration(self.file.path)
一些注意事項:
1/ 一個函數是一個動作,所以它的名字應該是一個動詞(即“extract_informations”)
2/ 您可能不希望每次保存對象時都重新解析文件的內容,只有在文件更改時才重新解析。 您可以使用 md5sum(存儲在模型中)來檢查這一點。
3/ 我沒有仔細檢查過,但我真的不認為你應該為這個字段使用默認值 - 如果你想讓它成為可選的,請使用blank=True
和null=True
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.