1. 程式人生 > >django-如何操作models.FileField資料型別

django-如何操作models.FileField資料型別

class ModelFormWithFileField(models.Model):
     title = models.CharField(max_length=50)
     file = models.FileField(upload_to='test')
 
     def __unicode__(self):
         return self.title

比如這是我定義的models類

在資料庫是這麼存的:

+----+-------+-------------------------------------------+
|  id  |  title  |         file                                            |
+----+-------+-------------------------------------------+
|  1 | 123   | data/detail.docx                              |
|  2 | 234   | data/model.txt                                  |
|  3 | 456   | test/10月22PS海報.doc                  |
|  4 | asd   | test/56bfb39bgw1ens2t1aeq.jpg |
|  5 | asd   | test/38.0.2125.24.manifest            |
+----+-------+-------------------------------------------+

進入django環境的shell


這裡匯入models,並選一個id為3名字為10月22PS海報.doc的物件x,其中x.file即為我們題目裡面的models.FileField資料型別

這裡出錯是因為python2.x的bug,當然python3.x沒這個問題,對策如下:


3行程式碼搞定


import File來包裝一下它,包裝過的檔案會自動close,這是官方的一句話和demo

The following approach may be used to close files automatically:

>>> from django.core.files import File

# Create a Python file object using open() and the with statement
>>> with open('/tmp/hello.world', 'w') as f:
...     myfile = File(f)
...     myfile.write('Hello World')
...
>>> myfile.closed
True
>>> f.closed
True

舉例兩個屬性name和size

當然它的所有屬性可以用dir(myFile)來獲得:



注意,如果要獲得檔案的url,不能包裝它成為File,只能通過

x.file.url獲得


其中的site_media是我在settings.py裡面設定的MEDIA_URL

-----------------------------------------------------------------分割線-----------------------------------------------------------------

下面說一下如何獲得檔案型別來return response

>>> from django.core.servers.basehttp import FileWrapper
>>> import mimetypes
>>> wrapper=FileWrapper(x.file)
>>> content_type=mimetypes.guess_type(x.file.url)
>>> print content_type
('application/msword', None)
>>> x.file.closed
False
>>> myFile.closed
False
>>> x.file.close()
>>> myFile.closed
True

#前提是x.file.url做好對映,讓django能找到檔案,或者我推測它只是通過後綴來確定

在views.py中:

update_to, filename = str(x.file).split('/')
response=HttpResponse(wrapper,mimetype='content_type')
response['Content-Length'] = x.file.size
response['Content-Disposition']="attachment;filename=%s" % filename
return response

搞定