django-rest-framework - 在序列化器中清理 django api
问题描述
我写了一个 django api 我想知道如果提醒字段发生了变化然后约会模型对象保存当前用户。我使用了这个链接 See object changes in post_save in django rest framework 并写下这段代码
class AppointmentBackOfficeViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
model = Appointment
read_serializer_class = AppointmentSerializer
write_serializer_class = AppointmentCreateSerializer
reminder_change = False
def perform_update(self, serializer):
if 'reminder' in serializer.validated_data:
self.reminder_change = True
serializer.save()
def update(self, request, *args, **kwargs):
super(AppointmentBackOfficeViewSet, self).update(request, *args, **kwargs)
instance = self.get_object()
instance.user = request.user
if self.reminder_change:
instance.reminder_user = request.user
instance.save()
res = self.write_serializer_class(instance).data
return Response(res)
class AppointmentCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Appointment
exclude = ['created_time', 'modified_time']
有没有办法比这更清楚地编写这段代码:不要使用 self.reminder_change 类字段有没有更好的方法?可能会将此行移动到序列化程序??(在序列化程序中不要访问 request.user)
解决方案
删除了不必要的字段和更新方法:
class AppointmentBackOfficeViewSet(mixins.ListModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.CreateModelMixin,
viewsets.GenericViewSet):
model = Appointment
read_serializer_class = AppointmentSerializer
write_serializer_class = AppointmentCreateSerializer
def perform_update(self, serializer):
# Here you can set attributes directly to the serializer update method
# It's like setting attribute directly to the updating model
# Check that reminder has been changed
reminder = serializer.validated_data.get('reminder')
if reminder and reminder != instance.reminder: # Reminder is different
serializer.save(user=self.request.user,
reminder_user=self.request.user)
else:
serializer.save(user=self.request.user)
此解决方案将根据提醒字段的类型起作用。
如果是 String 或 Integer 就可以了。问题是,如果它是对象。Viewset 将引发错误,因为序列化程序提醒字段将是整数,但 instance.reminder 将是提醒对象的实例,因此请记住这一点。
推荐阅读
- jpa-2.0 - 使用连接继承表时连接子表 [谓词]
- python - Kivy 标签文本开始更新太晚
- html - chrome 79 更新后页面被切断
- c++ - 将二进制转换为十进制我如何要求用户只输入二进制
- html - 将 2 个项目并排放置流体/响应(未知宽度)
- controller - 使用 clear() 方法清除 TextEditingController 会将焦点重新放在文本字段上
- typo3 - TYPO3 父母关系互惠
- r - 用 tidyverse 聚合大表
- flutter - 标签内容增加时如何使页面可滚动
- diff - Gerrit:对于所有用户,是否有忽略差异中的空白更改的设置?