django-如何操作models.FileField数据类型

使用Django处理文件型数据及HTTP响应
本文介绍如何在Django环境下处理文件型数据,包括文件读取、文件类型识别以及通过HTTP响应返回文件内容。重点展示了如何解决Python 2.x版本中的文件处理问题,并提供了将文件作为HTTP响应发送的方法。
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

搞定

<think>好的,用户想在Django Admin中操作MongoEngine的数据表。首先,我需要回忆一下django-mongoengine的集成步骤。根据引用[1]和[2],用户需要在models.py里定义MongoEngine的Document模型,比如MQTTUser_MongoModel。接下来,要让这个模型在Django Admin中显示,可能需要创建一个admin.py文件,并注册模型。 我记得Django Admin通常用于Django的ORM模型,但这里用的是MongoEngine,所以可能需要使用django-mongoengine提供的适配器或者特定的Admin类。引用[3]提到了应用案例和最佳实践,但没有直接说明Admin的配置。可能需要参考类似Django的ModelAdmin来设置。 用户可能需要继承admin.ModelAdmin,并在admin.site.register中注册他们的MongoEngine模型。但要注意,MongoEngine的Document和Django的Model有所不同,可能需要额外的配置,比如指定字段或者表单。例如,在admin.py中导入模型,然后注册,并可能需要自定义Admin类来处理字段显示。 另外,确保已经正确安装django-mongoengine,并在settings.py中配置了数据库连接。引用[3]里的运行示例应用命令可能涉及这些步骤,比如安装依赖和运行服务器。用户可能需要检查INSTALLED_APPS是否包含django_mongoengine,以及数据库设置是否正确指向MongoDB。 还可能遇到表单验证或查询的问题,因为MongoDB和关系型数据库不同。需要确保Admin页面的表单字段与MongoEngine的字段类型兼容。例如,StringField在Admin中可能显示为普通的文本输入,而DateTimeField可能需要合适的widget。 最后,测试是否能在Admin中正确显示和编辑数据。如果遇到错误,可能需要查看日志,检查模型注册是否正确,或者是否有字段不兼容的情况。引用[3]提到的索引优化和数据备份也是后续需要考虑的,但当前问题主要集中在Admin集成上。</think>以下是如何在Django Admin中操作MongoEngine数据表的完整教程,结合引用内容和实际开发经验整理: ### 一、环境配置 1. 安装依赖库 ```bash pip install django-mongoengine mongoengine ``` 2. 配置settings.py ```python INSTALLED_APPS = [ ... 'django_mongoengine', 'your_app' ] DATABASES = { 'default': { 'ENGINE': 'django.db.backends.dummy' } } MONGODB_DATABASES = { 'default': { 'name': 'your_db', 'host': 'localhost', 'port': 27017 } } ``` ### 二、定义MongoEngine模型 ```python # models.py from django_mongoengine import mongoengine as db class Article(db.Document): title = db.StringField(max_length=200) content = db.StringField() publish_date = db.DateTimeField() tags = db.ListField(db.StringField()) meta = { 'collection': 'blog_articles', 'ordering': ['-publish_date'] } ``` ### 三、配置Admin界面 ```python # admin.py from django_mongoengine.admin import DocumentAdmin from .models import Article class ArticleAdmin(DocumentAdmin): list_display = ('title', 'publish_date') search_fields = ('title', 'content') list_filter = ('tags',) fields = ('title', 'content', 'tags') admin.site.register(Article, ArticleAdmin) ``` ### 四、关键功能实现 1. **嵌套文档支持**: ```python class Comment(db.EmbeddedDocument): author = db.StringField() content = db.StringField() class Article(db.Document): comments = db.ListField(db.EmbeddedDocumentField(Comment)) ``` 2. **自定义表单验证**: ```python from django import forms class ArticleForm(forms.ModelForm): class Meta: model = Article fields = '__all__' def clean_title(self): title = self.cleaned_data['title'] if len(title) < 10: raise forms.ValidationError("标题至少需要10个字符") return title class ArticleAdmin(DocumentAdmin): form = ArticleForm ``` ### 五、注意事项 1. 字段类型对应关系: - MongoDB ObjectId 字段需使用`db.ObjectIdField()` - 地理空间字段使用`db.PointField()` - 文件存储使用`db.FileField()` 2. 性能优化建议: - 为常用查询字段添加索引 ```python meta = { 'indexes': [ {'fields': ['title'], 'unique': True}, {'fields': ['publish_date']} ] } ``` - 使用`select_related()`优化嵌套文档查询 - 避免在Admin中加载大型二进制字段 3. 权限控制示例: ```python class ArticleAdmin(DocumentAdmin): def has_add_permission(self, request): return request.user.is_superuser def has_delete_permission(self, request, obj=None): return request.user.is_staff ``` ### 六、调试工具 建议安装`django-debug-toolbar-mongo`[^3],在settings.py中添加配置: ```python DEBUG_TOOLBAR_PANELS = [ ... 'debug_toolbar_mongo.panel.MongoDebugPanel' ] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值