簡體   English   中英

Django models.py 中的文件操作

[英]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=Truenull=True

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM