使用Django SimpleUploadedFile 來上傳檔案到資料庫去。~~~(筆記)

起因:

只是想要在python console下簡單測試一個file model是否真的可以上傳檔案,並且依照django setting的media root 設定將檔案上傳到指定位置。

下面是一個django 的database model 的部份內容:
# The FW path and filename
def generate_fw_path(instance, filename):
    return "uploaded_files/{0}".format(filename)


class Files(models.Model):
    file=models.FileField(upload_to=generate_file_path)
    ..........


其實就只是一個用來放上傳檔案的Database 欄位。

然後該makemigrations 、 migrate 建立database 之後在python的console下測試上傳檔案(ps 我用ipython取代原本弱弱的python 原生console mode。 用pip install ipython就可以使用了)。



在virtualenv 下執行ipython 進入console mode 接著import  Files model與 SimpleUploadedFile。
In [1]: from django.core.files.uploadedfile import SimpleUploadedFile
In [2]: from mytest.models import Files
In [3]: 

我們先用SimpleUploadedFile 把檔案變成一個class:

_file = SimpleUploadedFile('README.md',  open('README.md', 'r').read())

第一個README.md是指定上傳後的檔案名稱,第二README.md是我們用來開檔的目標檔名~由於我是把README.md直接放在專案目錄下,所以沒有給絕對路徑

此時SimpleUploadedFile就會把檔案上傳並轉成一個物件

print(type(_file)) 

得到 <class django.core.files.uploadedfile.simpleuploadedfile>
然後就可以把這個物件當作fileField丟給model去處理。

testfile = Files.objects.create(file=_file)
testfile.save()

此時在media/uploaded_files/ 目錄下應該就會多一個叫做README.md的檔案並且內容跟我們上傳的檔案內容應該會一致

另一種則是我們一樣用SimpleUploadedFile 但是手動塞內容:

_file2 = SimpleUploadedFile('lol.txt', b'hello world')
testfile2 = Files.objects.create(file=_file2)
testfile2.save()

此時media/uploaded_files/ 目錄下應該也會多一個名叫做lol.txt的檔案,內容就只有'hello world'這兩個字。

Ref:
Django UploadedFile


留言