我正在构建一个Django+DRF/React应用程序(简单博客应用程序),我在保存嵌套图像时遇到了困难。
模型结构
:
)
过程
<input type="file" multiple />
通过FormData实现
request.data类PostFormView(generics.RetrieveUpdateDestroyAPIView):queryset = Post._objects.is_active() serializer_class = PostModelSerializer permission_classes = (IsOwnerOr401,) parser_classes = (parsers.MultiPartParser,parsers.JSONParser,parsers.FormParser,( super().get_queryset().annotate(**sharedAnnotations(request=self.request)) ) parsers.FileUploadParser) lookup_field = 'slug‘lookup_url_kwarg =’self get_queryset(self):返回lookup_field更新(self,request,*args,**kwargs):data = request.data _images =data.getlist(‘图像’)_images= [] for _ in _images: if isinstance(_,dict):images.append(图像)继续images.append({'image':_,'object_id':self.get_object(),.pk,‘'content_type':self.get_object().get_content_type().pk})数据’图像‘=图像打印(数据)分部=kwargs.pop(’分部‘,False)实例= self.get_object()序列化程序=self.get_serializer(实例,data=data,Response(serializer.data) ( partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(序列化程序)如果getattr(例如,‘_pre提取_objects_cache’,无):instance._prefetched_objects_cache = {}返回self.perform_update
类MediaModelSerializer(ContentTypeModelSerializer):#继承object_id和content_type字段,以避免重复(创建和更新fns)类元: model =媒体字段=‘_all_ class is_active = serializers.BooleanField(default=True) path = serializers.HyperlinkedIdentityField( view_name=“api:post- details”),查找_field=’slug‘图像= MediaModelSerializer(many=True) details= DetailModelSerializer(required=False ),many=True) #注释字段is_author = serializers.BooleanField(read_only=True,default=False)类Meta: model = Post字段= '__all__‘read_only_fields = 'is_locked','slug','user','is_author’def创建(self,validated_data):返回超级().create(Validated_data) def更新(self,实例,):返回超级() validated_data) (实例,validated_data).update
PostFormView.update(self, request, *args, **kwargs)的print(data)语句(操作后)返回以下内容:,'object_id':8,'content_type':20},{'image':,'object_id':8,‘content_type’20},{‘bmw_1.jpeg’:
400_BAD_REQUEST,因为图像没有传递给PostModelSerializer{“图像”:“此字段是必需的。”}
我已经面对这个问题三天了,我不能把我的头绕在根本原因上。
谢谢你的帮助。
发布于 2020-10-20 22:49:26
我一直在网上寻找,但是找不到任何一个人,所以我不得不走这条路。
我已经从PostFormView.update(...)中删除了处理部分,并在ModelSerializer的create & update方法中直接访问了ModelSerializer。稍后我将了解如何处理删除这些图像的方法。
下面是代码:
class PostModelSerializer(WritableNestedModelSerializer):
is_active = serializers.BooleanField(default=True)
path = serializers.HyperlinkedIdentityField(
view_name="api:post-detail", lookup_field='slug')
images = MediaModelSerializer(read_only=True, many=True)
details = DetailModelSerializer(required=False, many=True)
# annotated fields
is_author = serializers.BooleanField(read_only=True, default=False)
class Meta:
model = Post
fields = '__all__'
read_only_fields = ['is_locked', 'slug', 'user', 'is_author']
def create(self, validated_data):
instance = super().create(validated_data)
request = self.context.get('request', None)
if request:
try:
images = request.data.getlist('images')
for image in images:
self.instance.images.create(image=image)
except Exception as e:
pass
return instance
def update(self, instance, validated_data):
instance = super().update(instance, validated_data)
request = self.context.get('request', None)
if request:
try:
images = request.data.getlist('images')
for image in images:
self.instance.images.create(image=image)
except Exception as e:
pass
return instance如果以前有人遇到过这个问题,并设法解决了,请将你的答案贴在下面。
谢谢!
https://stackoverflow.com/questions/64449602
复制相似问题