DRF文件上传及访问
关于DRF文件上传:
其实我的掌握并不强,目前也只能完成非前后端分离的状态提交的数据,在前后端分离的状态,我提交的数据不知道为什么始终无法传上来,查验代码之后提示是我的上传数据格式不一致,但是查了好久都没找到具体的解决办法
那么,先演示一下使用drf进行的django工程内部的提交:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| class imgCal(ModelViewSet): queryset = imageInfo.objects.all() serializer_class = StudentsSerializer def get(self,request): return render(request,'./imgfrom.html')
def post(self, request, *args, **kwargs): a_dict = {} a_dict['name'] = request.POST.get('name') a_dict['img'] = request.FILES.get('img') print(request.GET) serializer = self.get_serializer(data=a_dict) print(serializer.is_valid()) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
def perform_create(self, serializer): if serializer.is_valid(raise_exception=True): serializer.save() else: print('数据无效',serializer.data) return Response(serializer.data)
def get_success_headers(self, data): try: return {'Location': str(data[api_settings.URL_FIELD_NAME])} except (TypeError, KeyError): return {}
|
以下是序列化器部分:
1 2 3 4 5
| class StudentsSerializer(serializers.ModelSerializer):
class Meta: model = imageInfo fields = '__all__'
|
平平无奇的序列化器,没有添加什么额外的配置要求
值得一提的是,在数据库中我并不是使用的imageFields,而是使用了兼容性感觉更高的filefield
下面是数据库配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| def upload_to(instance, fielname): return '/'.join([settings.MEDIA_ROOT, instance.user_name, fielname])
class imageInfo(models.Model): name = models.CharField(max_length=50) img = models.FileField(upload_to='')
def __str__(self): return self.name
class Meta: db_table = 'imageinfo'
|
以下是路由配置:
1 2 3 4 5 6 7 8 9
| re_path('media/(?P<path>.*)',serve,{'document_root':settings.MEDIA_ROOT}),
MEDIA_URL = 'static/media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'static\media')
|
在完成上述的代码之后,只需要配置好模板文件即可,正常的form表单的提交方法,后台的代码将会自行对获得的数据进行解析存储