Reactjs Django-3.1/DRF/React:无法保存嵌套图像(通过GenericRelation链接)
我正在构建一个Reactjs Django-3.1/DRF/React:无法保存嵌套图像(通过GenericRelation链接),reactjs,django,django-rest-framework,django-contenttypes,Reactjs,Django,Django Rest Framework,Django Contenttypes,我正在构建一个Django+DRF/Reactapp(简单博客app),我在保存嵌套图像时遇到了困难 模型结构 型号: 职位 儿童: 详细信息:ContentType模型(DRF:保存成功) 图像:ContentType模型(DRF:保存未成功) 过程 从 通过FormData 捕获request.data并对其进行处理 class PostFormView(generics.RetrieveUpdateDestroyAPIView): queryset = Pos
Django+DRF/React
app(简单博客app),我在保存嵌套图像时遇到了困难
模型结构
- 型号:
- 职位
- 儿童:
- 详细信息:ContentType模型(DRF:保存成功)
- 图像:ContentType模型(DRF:保存未成功)
- 从
- 通过
FormData
- 捕获
并对其进行处理request.data
class PostFormView(generics.RetrieveUpdateDestroyAPIView): queryset = Post._objects.is_active() serializer_class = PostModelSerializer permission_classes = (IsOwnerOr401,) parser_classes = (parsers.MultiPartParser,parsers.JSONParser, parsers.FormParser, parsers.FileUploadParser) lookup_field = 'slug' lookup_url_kwarg = 'slug' def get_queryset(self): return super().get_queryset().annotate(**sharedAnnotations(request=self.request)) def update(self, request, *args, **kwargs): data = request.data _images = data.getlist('images') images = [] for _ in _images: if isinstance(_, dict): images.append(images) continue images.append({'image': _, 'object_id': self.get_object().pk, 'content_type': self.get_object().get_content_type().pk}) data['images'] = images print(data) partial = kwargs.pop('partial', False) instance = self.get_object() serializer = self.get_serializer(instance, data=data, partial=partial) serializer.is_valid(raise_exception=True) self.perform_update(serializer) if getattr(instance, '_prefetched_objects_cache', None): instance._prefetched_objects_cache = {} return Response(serializer.data)
- 保存图像(失败):
PostFormView.update(self、request、*args、**kwargs)中的
语句(操作后)返回以下内容:print(data)
<QueryDict: {'id': ['8'], ..., 'images': [[{'image': <InMemoryUploadedFile: bmw_3.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}, {'image': <InMemoryUploadedFile: bmw_2.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}, {'image': <InMemoryUploadedFile: bmw_1.jpeg (image/jpeg)>, 'object_id': 8, 'content_type': 20}]]}>
谢谢你的帮助。我一直在网上找,但是找不到任何人,所以我不得不走这条路 我已经从
PostFormView.update(…)
中删除了处理部分,并直接在ModelSerializer
的create
和update
方法中访问了图像。稍后,我将了解如何处理删除这些图像
代码如下:
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
如果有人曾经遇到过这个问题并设法解决了它,请在下面发布您的答案
谢谢大家! 我在互联网上到处找,但找不到任何人,所以我不得不走这条路
我已经从PostFormView.update(…)
中删除了处理部分,并直接在ModelSerializer
的create
和update
方法中访问了图像。稍后,我将了解如何处理删除这些图像
代码如下:
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
如果有人曾经遇到过这个问题并设法解决了它,请在下面发布您的答案
谢谢大家!
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