django - 为什么在 django 序列化程序中不调用 create 方法?
问题描述
我希望能够一一发布到 ManyToManyField (ImageTag) 的条目。我正在使用额外的操作在图像下创建一个嵌套端点。
我希望能够一次发布一个 POST 条目。
localhost:8000/my_app/images/IMG_123/image_tags/
我想重写序列化器上的 create 方法来做到这一点。但问题是它没有被调用。为什么?
这是我的源代码:
#models.py
class ImageTag(models.Model):
name = models.CharField()
description = models.CharField()
class Image(models.Model):
image_id = models.CharField(unique=True)
image_tags = models.ManyToManyField(ImageTag, blank=True)
...
#serializers.py
class ImageSerializer(serializers.ModelSerializer):
class Meta:
model = Image
fields = '__all__'
class ImageTagSerializer(serializers.ModelSerializer):
image_tags = serializers.StringRelatedField(many=True)
class Meta:
model = Image
fields = ('image_tags',)
def to_internal_value(self, data):
return data
def create(self, validated_data):
print("GOTHERE")
print("VALI", validated_data)
return validated_data
#views.py
class ImageExtraAction(viewsets.ModelViewSet):
@action(detail=True, methods=['get', 'post', 'delete'])
def image_tags(self, request, capture_id=None):
capture = self.get_object()
serializer = ImageTagSerializer(capture, data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_200_OK)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class ImageTagViewSet(ImageExtraAction, viewsets.ModelViewSet):
queryset = Image.objects.all()
serializer_class = ImageSerializer
lookup_field = 'image_id'
...
#urls.py
router.register(r'images', ImageTagViewSet, basename='image')
解决方案
因为您在初始化序列化程序时也传递了实例。
serializer = ImageTagSerializer(capture, data=request.data)
这里,capture
是模型实例,当时DRF认为这是一个更新操作,因此,DRF使用update(...)
了序列化器的方法。
推荐阅读
- node.js - npm WARN saveError ENOENT:没有这样的文件或目录
- typescript - 如何解决与错误相关的错误:打字稿中的 TS2705
- sql - 创建一个查询,该查询根据多个字段从另一个表中检查是否存在
- flutter - Flutter IphoneX 状态栏颜色无 app Bar
- javascript - AppSync GraphQL 模拟解析器映射未生成唯一项目
- c++ - 为什么此代码显示第 1 行所需的错误左值?如何解决?
- pythonanywhere - 文件编辑器在 pythonanywhere 中的文件太小
- express - 在 apollo-server-express 中将 snake_case 转换为 camelCase 字段名称
- javascript - 在没有装饰器的情况下使用 `Component`
- html - 如何将表格 TR 精确设置为图像