【问题标题】:How to save files to database in django如何在django中将文件保存到数据库
【发布时间】:2016-07-28 06:37:39
【问题描述】:

我正在尝试使用 django 表单上传文件并将这些文件保存在数据库本身中。 我已经能够将文件的链接保存在数据库中,并将文件本身保存在我在 Media_root 中指定的目录中。请你帮我告诉我我可以在我的代码中更改什么,以便将文件保存在数据库中.

这是我的代码:

models.py

​​>
from django.db import models


class Document(models.Model):
    docfile = models.FileField(upload_to='documents/%Y/%m/%d')

forms.py

​​>
from django import forms

class DocumentForm(forms.Form):
    docfile = forms.FileField(
        label='Select a file',
    )

views.py

​​>
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from .models import Document
from .forms import DocumentForm

def list(request):
    # Handle file upload
    if request.method == 'POST':
        form = DocumentForm(request.POST, request.FILES)
        if form.is_valid():
            newdoc = Document(docfile = request.FILES['docfile'])
            newdoc.save()

            # Redirect to the document list after POST
            return HttpResponseRedirect(reverse('upload.views.list'))
    else:
        form = DocumentForm() # A empty, unbound form

    # Load documents for the list page
    documents = Document.objects.all()

    # Render list page with the documents and the form
    return render_to_response(
    'list.html',
    {'documents': documents, 'form': form},
    context_instance=RequestContext(request)
    )

def index(request):
    return render_to_response('index.html')

app\urls.py

​​>
from django.conf.urls import patterns, include, url
from django.conf import settings
from django.conf.urls.static import static
from django.views.generic import RedirectView
from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns('',
        (r'^upload/', include('upload.urls')),
        (r'^$', 'upload.views.index'),
        (r'^admin/', include(admin.site.urls)),) + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

项目\urls.py

​​>
from django.conf.urls import patterns, include, url

urlpatterns = patterns('upload.views',
    url(r'^$', 'list', name='list'),
    url(r'^list/$', 'list', name='list'),)

【问题讨论】:

  • 有一些库 - like this one - 提供数据库存储后端。
  • @solarissmoke 我看过这个 github 页面,但是我该如何使用它?
  • 不要在数据库中保存文件。为此使用文件系统。
  • @mirosval 我必须这样做。我想不想做都无所谓。
  • @superconductor 阅读文档?

标签: python django


【解决方案1】:

Django 提供BinaryField,让您可以存储任何二进制数据,包括文件内容。

请注意,文档还说:

尽管您可能会考虑将文件存储在数据库中,但请考虑在 99% 的情况下这是糟糕的设计。此字段不能替代正确的静态文件处理。

如果您不想将文件存储在 Web 服务器的文件系统上,您可以探索其他选项,例如 Amazon S3 或仅使用 FTP 服务器。看看django-storages 库,它提供了很多不错的选项。

【讨论】:

  • 非常感谢,现在我可以将文件从管理页面上传到数据库,但是你能帮我看看如何查看它们并下载它们
  • 了解有关避免将文件存储在数据库中的建议会很有趣。
  • 您不能直接从数据库中提供服务,而且您的数据库和应用程序服务器通常都有比推送有效负载更令人兴奋的职责。此外,我认为对备份进行分离很方便——您可能希望对数据库进行时间点恢复,但对文件具有相同级别可能是不必要的开销。 OTOH,外部文件存储可以自己处理备份,直接提供文件(有或没有身份验证)并利用 CDN 来提高效率。
  • 我认为没有人会考虑来自数据库的强大/服务静态文件(如网站访问者所需的 JS、CSS)。通常是关于上传(zip 文件、图像、附件)的问题。而且我听说出于这些目的,数据库可以完美运行,直到非常高的负载(每天 100 GB)。因此,对于存储在 DB 中的大多数项目来说,应该是完全没问题的
猜你喜欢
  • 2017-01-23
  • 1970-01-01
  • 2022-12-20
  • 2017-05-13
  • 2015-06-21
  • 2014-12-18
  • 2021-02-22
  • 1970-01-01
  • 2013-07-11
相关资源
最近更新 更多