gpt4 book ai didi

python - 如何在 DRF 中的序列化程序验证/保存之前添加其他数据?

转载 作者:可可西里 更新时间:2023-11-01 16:37:37 25 4
gpt4 key购买 nike

所以我有这个类:

class MyClass(models.Model):    
name = models.CharField(max_length=100)
created_time = models.DateTimeField(auto_now_add = True)
modified_time = models.DateTimeField(auto_now = True)

然后是代表相关照片的其他类到 MyClass:

class MyPhoto(models.Model):
myclass = models.ForeignKey(MyClass, unique=False, related_name='photos')
photo = models.ImageField(upload_to='photos',blank=False)

我想创建一个端点,它将处理照片上传(内容类型将是多部分的,相关 myclass 的 ID 将在 url 中传递),所以这就是我所拥有的:

urls.py:

router = routers.DefaultRouter()    
router.register(r'photos/(?P<myclass_id>\d+)',PhotoViewSet)

View 集:

class PhotoViewSet(CreateModelMixin,
viewsets.GenericViewSet):
queryset = MyPhoto.objects.all()
serializer_class = serializers.PhotoAlterSerializer
parser_classes = (parsers.MultiPartParser,)

def create(self, request, *args,**kwargs):
myclass = MyClass.objects.get(pk=kwargs['myclass_id'])
serializer = serializers.PhotoAlterSerializer(data=request.data,context={'request': request})
if serializer.is_valid(raise_exception=True):
photo=serializer.save(myclass=myclass)
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

和序列化器:

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = ('myclass','photo')

如您所见,我向 serializer.save(myclass=myclass) 方法添加了额外的属性 myclass。

但是,如果我上传照片并在 url 中正确传递 myclass id,我会收到 This field is required. 错误。如果我将指向 myclass 的正确超链接添加到上传的带有照片的多部分表单中,请求将通过验证,然后来自表单的 myclass 将被我从 url id 获得的 myclass 替换。

如果我只将照片发布到 url http://blabla/api/photos/2,我该如何进行这项工作?这张照片和 pk=2 的 myclass 的实例将被保存到 db?

最佳答案

这是因为您在序列化程序的字段元中指定了 myclass。这使得 DRF 需要并验证它作为 POST 数据的一部分。您自己设置的任何字段都不应该是序列化程序字段的一部分。因此,要使其正常工作,您只需从 Meta.fields 中删除 myclass

class PhotoAlterSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = MyPhoto
fields = ('photo', )

关于python - 如何在 DRF 中的序列化程序验证/保存之前添加其他数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28653011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com