如何在Django RetrieveUpdateDestroyAPIView中自定义更新模型字段值
实现方案
RetrieveUpdateDestroyAPIView本身不会主动修改业务字段值,你可以根据实际需求选择以下两种实现方式:
方式1:允许前端PUT请求时传入published值手动更新
如果你的业务逻辑是由前端控制published字段的更新值,只需要确认你的PostSerializer序列化器已经将published字段加入可编辑字段列表即可:
# serializers.py 参考示例 from rest_framework import serializers from blog.models import Post class PostSerializer(serializers.ModelSerializer): class Meta: model = Post # 必须将published加入字段列表才可被接口提交修改 fields = ['id', 'category', 'title', 'excerpt', 'content', 'slug', 'published', 'author', 'status']
配置完成后,前端在PUT请求的请求体中携带published字段和对应值,即可完成该字段的更新。
方式2:后端自动更新published为当前时间,无需前端传参
如果你的需求是每次触发更新操作时,自动将published字段设置为当前时间,不需要前端传递参数,可以重写PostDetail视图的update方法实现:
# 先导入timezone、Response依赖 from django.utils import timezone from rest_framework.response import Response # 修改view.py中的PostDetail类 class PostDetail(generics.RetrieveUpdateDestroyAPIView): queryset = Post.objects.all() serializer_class = PostSerializer def update(self, request, *args, **kwargs): partial = kwargs.pop('partial', False) instance = self.get_object() # 手动更新published为当前时间 instance.published = timezone.now() instance.save() serializer = self.get_serializer(instance, data=request.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)
你也可以选择在序列化器的update方法中完成该逻辑修改,效果完全一致:
# serializers.py 重写update方法 from django.utils import timezone class PostSerializer(serializers.ModelSerializer): class Meta: model = Post fields = ['id', 'category', 'title', 'excerpt', 'content', 'slug', 'published', 'author', 'status'] def update(self, instance, validated_data): validated_data['published'] = timezone.now() return super().update(instance, validated_data)
内容的提问来源于stack exchange,提问作者Ibtsam Ahmad
相关产品推荐
相关产品推荐

