当前位置: 首页 > 知识库问答 >
问题:

Django REST Framework+Django REST Swagger+ImageField

萧元徽
2023-03-14

我用ImageField创建了一个简单的模型,我想用django-rest-framework+django-rest-swagger创建一个api视图,它是文档化的,并且能够上传文件。

以下是我得到的:

models.py

from django.utils import timezone
from django.db import models

class MyModel(models.Model):

    source = models.ImageField(upload_to=u'/photos')
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)

    def __unicode__(self):
        return u"photo {0}".format(self.source.url)
from .models import MyModel

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = [
            'id',
            'source',
            'created_at',
        ]

views.py

from rest_framework import generics
from .serializer import MyModelSerializer

class MyModelView(generics.CreateAPIView):
    serializer_class = MyModelSerializer
    parser_classes = (FileUploadParser, )

    def post(self, *args, **kwargs):
        """
            Create a MyModel
            ---
            parameters:
                - name: source
                  description: file
                  required: True
                  type: file
            responseMessages:
                - code: 201
                  message: Created
        """
        return super(MyModelView, self).post(self, *args, **kwargs)

urls.py

from weddings.api.views import MyModelView

urlpatterns = patterns(
    '',
    url(r'^/api/mymodel/$', MyModelView.as_view()),
)

我阅读了django-rest-framework中的这部分文档:

我正在使用django==1.8.8djangoRestFramework==3.3.2django-rest-swagger==0.3.4

共有1个答案

酆君墨
2023-03-14

我通过对你的代码做了几个修改来完成这个工作。

首先,在models.py中,将imagefield名称更改为file并使用相对路径上载文件夹。当您将文件作为二进制流上载时,它可以在request.data字典中的文件键(request.data.get('file'))下使用,因此最干净的选项是将它映射到具有相同名称的model字段。

from django.utils import timezone
from django.db import models


class MyModel(models.Model):

    file = models.ImageField(upload_to=u'photos')
    is_active = models.BooleanField(default=False)
    created_at = models.DateTimeField(default=timezone.now)

    def __unicode__(self):
        return u"photo {0}".format(self.file.url)

serializer.py中,将源字段重命名为file:

class MyModelSerializer(serializers.ModelSerializer):

    class Meta:
        model = MyModel
        fields = ('id', 'file', 'created_at')

在views.py中,不要调用super,而是调用create():

from rest_framework import generics
from rest_framework.parsers import FileUploadParser

from .serializer import MyModelSerializer


class MyModelView(generics.CreateAPIView):
    serializer_class = MyModelSerializer
    parser_classes = (FileUploadParser,)

    def post(self, request, *args, **kwargs):
        """
            Create a MyModel
            ---
            parameters:
                - name: file
                  description: file
                  required: True
                  type: file
            responseMessages:
                - code: 201
                  message: Created
        """
        return self.create(request, *args, **kwargs)

我已经使用邮差Chrome扩展来测试这一点。我已将图像上载为二进制文件,并手动设置了两个头:

Content-Disposition: attachment; filename=upload.jpg
Content-Type: */*
 类似资料:
  • 不重复造轮子,是开发人员共同的哲学道理。在使用 Python 开发 RESTful Web API 时,就有一个大名鼎鼎的轮子 Django REST framework,这一节我们就来简单了解一下 Django REST framework。 Django REST framework 一听就是和著名的 Python web 开发框架 Django 有很大的关系,这个框架是由 Tom Chris

  • 问题内容: 为什么要使用一个来公开Django应用程序的API? 问题答案: TastyPie 正如Torsten所指出的那样,使用与令人敬畏的django-haystack相同的偷偷摸摸的东西写的东西不会出错。从我在邮件列表中看到的内容来看,Daniel Lindsey等人非常有帮助,Tastypie稳定,全面并且有据可查 出色的表现为你提供了一套明智的默认行为,并使使用这种样式的API的构建变

  • 问题内容: 我在通过Jquery / ajax POST提交带有图像字段的表单(Django表单)时遇到一些问题。即时通讯在imagefield上返回“ Field required”验证错误。 我一直尝试通过添加formData来尝试不同的解决方案,但到目前为止没有任何结果。我在正确的轨道上吗?请指出正确的方向。谢谢! 更新:我可以将imagefield设置为required = false,但

  • 问题内容: 我刚刚将应用程序升级到1.7(实际上仍在尝试)。 这是我在models.py中拥有的: 当我尝试时,它抛出: 问题答案: 我不确定是否可以回答自己的问题,但我只是想出了(我认为)。 根据此错误报告,我编辑了代码: 然后,在字段定义中: 这对我有用。

  • 问题内容: 想象一下这个非常简单的模型: 我想从图像URL创建照片(即,不是在django管理站点中手动创建)。 我认为我需要做这样的事情: 如果不告诉我,我希望我已经很好地解释了问题。 谢谢 :) 编辑: 这可能有效,但我不知道如何转换为Django文件: 问题答案: 我刚刚针对同一问题创建了http://www.djangosnippets.org/snippets/1890/。该代码与上面的

  • 问题内容: 我的模型与现场 函数根据图像文件名命名。 但是,当用户更新头像时,新的头像名称与旧的头像名称一致,并且Django在文件名中添加后缀。 有办法覆盖文件而不是创建新文件吗? 问题答案: 是的,这对我也很重要。这就是我所做的。 模型: 还定义在中: 在另一个文件中,: 显然,这些是这里的示例值,但是总体而言,这对我来说效果很好,并且根据需要进行修改应该非常简单。

  • 问题内容: 我的Django应用中有以下模型: 我已将MEDIA_ROOT设置为Apache网络根目录中的/ hmedia /目录,并将MEDIA_URL设置为’http://localhost/hmedia/'。这似乎奏效了-我已通过Django管理网站成功上传了几张图片,并且可以通过查看这些图片http://localhost/hmedia/images/[filename]。并且Django

  • 问题内容: 好的,我已经尝试了几乎所有内容,但无法正常工作。 我有一个上面带有ImageField的Django模型 我有通过HTTP下载图像的代码(已测试并且可以工作) 图像直接保存到“ upload_to”文件夹中(upload_to是在ImageField上设置的文件夹) 我需要做的就是将已经存在的图像文件路径与ImageField相关联 我已经用6种不同的方式编写了这段代码。 我遇到的问题