Jek*_*son 6 django django-serializer django-rest-framework
我有一个简单的文件模型
class Documents(models.Model):
""" uploaded documents"""
author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
upload = models.FileField(storage=PrivateMediaStorage())
filename = models.CharField(_('documents name'), max_length=255, blank=True, null=True)
datafile = models.FileField()
created = models.DateTimeField(auto_now_add=True)
type = models.ForeignKey(Doctype, on_delete=models.CASCADE, blank=True)
Run Code Online (Sandbox Code Playgroud)
要显示上传的文档列表并添加新文件,我使用了类
class DocumentsListView(viewsets.ViewSetMixin,generics.ListCreateAPIView):
queryset = Documents.objects.all()
serializer_class = DocumentsSerializer
def perform_create(self, serializer):
serializer.save(author=self.request.user)
Run Code Online (Sandbox Code Playgroud)
序列化程序.py
class DocumentsSerializer(AwsUrlMixin, serializers.ModelSerializer):
type_name = serializers.CharField(source='type.type', read_only=True)
type = serializers.PrimaryKeyRelatedField(queryset=Doctype.objects.all())
view_file = serializers.SerializerMethodField()
author = serializers.CharField(source='author.username', read_only=True)
created = serializers.DateTimeField(format=date_format, input_formats=None, default_timezone=None, read_only=True)
class Meta:
model = Documents
fields = ('id', 'author', 'filename', 'datafile', 'type', 'type_name', 'created', 'view_file')
Run Code Online (Sandbox Code Playgroud)
我使用标准的 DRF 界面,我正常显示所有内容并将新文件添加到数据库中。
在阅读文档时,我遇到了 MultipartParser、FileUploadParser 等解析器,它们也在添加新文件时使用。我无法理解何时使用它们以及它们执行什么功能,因为现在没有它们一切都可以工作。
文档没有让我清楚地了解何时需要使用解析器。
我尝试添加
parser_classes = (MultiPartParser, FileUploadParser)
Run Code Online (Sandbox Code Playgroud)
到 views.py 并没有任何改变。一切都像以前一样工作。如果您能向我说明这一点,我将不胜感激。
Django REST 中的解析器用于解析传入的 HTTP 请求的内容。在 HTTP 请求中,我们以字符串格式接收数据。解析器将根据 HTTP 请求中收到的 Content-Type 标头将 HTTP 内容解析为 python 数据类型。Django的REST框架提供了大量的内置的解析器,它解析不同类型的内容等application/json,multipart/form-data,application/xml等,基于在HTTP请求中接收的Content-Type头。
Django REST 中的解析器类:
JSON解析器
表单解析器
多部分解析器
request.data将是QueryDict包含所有表单参数的一个。request.files将是一个QueryDict包含所有表单文件的文件。文件上传解析器
它用于解析 HTTP 请求中发送的单个文件。
它需要一个 url 关键字参数“文件名”。如果没有提供,那么我们应该在 Content-Disposition HTTP 标头中提供文件名。例如 Content-Disposition:attachment; 文件名=上传.jpg。
request.file 用于访问上传文件的内容。
参考:https : //learnbatta.com/blog/parsers-in-django-rest-framework-85/
解析器帮助您的视图解析以特定格式提交的数据。基本上,它们Content-Type将 HTTP 请求的标头映射到将该类型解析为您Serializer可以理解的 Python 结构所需的代码。
如果您提交此处列出的内容类型的内容,则无需执行任何操作,也无需向视图添加任何解析器。DRF 已经将这些解析器用于这些内容类型。
只有当您的客户端要以不同的形式提交数据时,例如以 XML 或 yaml 格式,您才需要添加自己的解析器,其中许多解析器已经由其他人编写并且可以在网上找到。将您提到的解析器添加到视图中没有任何作用的原因是它们已经是 DRF 使用的默认值。
因此,假设您必须与使用 SOAP(上帝保佑……)的老式 API(通常是企业)集成,然后您必须引入自己的解析器。
| 归档时间: |
|
| 查看次数: |
3585 次 |
| 最近记录: |