对于需要上传文件并发送一些数据的人来说,没有直接的转发方式可以让它工作。有一个开放问题 https://github.com/json-api/json-api/issues/246在 json api 规范中。我见过的一种可能性是使用multipart/related
如图所示here https://cloud.google.com/storage/docs/json_api/v1/how-tos/multipart-upload,但我认为在drf中实现它非常困难。
最后我实现的是将请求发送为formdata
。您可以将每个文件发送为file以及所有其他数据作为文本。
现在,为了以文本形式发送数据,您可以使用一个名为data并将整个 json 作为值字符串发送。
模型.py
class Posts(models.Model):
id = models.UUIDField(default=uuid.uuid4, primary_key=True, editable=False)
caption = models.TextField(max_length=1000)
media = models.ImageField(blank=True, default="", upload_to="posts/")
tags = models.ManyToManyField('Tags', related_name='posts')
serializers.py -> 不需要进行特殊更改,由于可写的 ManyToMany 字段实现,因此未在此处显示我的序列化器,因为它太长了。
views.py
class PostsViewset(viewsets.ModelViewSet):
serializer_class = PostsSerializer
parser_classes = (MultipartJsonParser, parsers.JSONParser)
queryset = Posts.objects.all()
lookup_field = 'id'
您将需要如下所示的自定义解析器来解析 json。
utils.py
from django.http import QueryDict
import json
from rest_framework import parsers
class MultipartJsonParser(parsers.MultiPartParser):
def parse(self, stream, media_type=None, parser_context=None):
result = super().parse(
stream,
media_type=media_type,
parser_context=parser_context
)
data = {}
# find the data field and parse it
data = json.loads(result.data["data"])
qdict = QueryDict('', mutable=True)
qdict.update(data)
return parsers.DataAndFiles(qdict, result.files)
The request example in postman
EDIT:
see this https://stackoverflow.com/a/50514022/3701807如果您想将每个数据作为键值对发送,则扩展答案