使用Django Serializer向数据库保存数据的更优实现方式咨询
代码优化方案
你现有视图代码存在笔误:实例化序列化器时调用的是
BusinessSerializer,按照业务逻辑应该是ServiceSerializer,这个问题需要先修正。
以下是大幅精简后的可落地实现方案,核心是利用DRF自带的通用视图和序列化器能力减少冗余代码,后续扩展新接口时也可以复用这套逻辑,避免重复写校验、保存、返回的重复代码:
优化后代码
1. serializers.py
将business字段设置为不需要前端传入,由序列化器内部自动获取当前用户关联的Business对象,避免视图层手动赋值:
from rest_framework import serializers from django.shortcuts import get_object_or_404 from .models import Services, Business class ServiceSerializer(serializers.ModelSerializer): class Meta: model = Services fields = ('id', 'service') # 移除business字段,不需要前端传递 def create(self, validated_data): # 从序列化器上下文获取当前请求,自动关联对应用户的business user = self.context['request'].user business = get_object_or_404(Business, user=user) validated_data['business'] = business return super().create(validated_data)
2. views.py
直接继承DRF的CreateAPIView通用视图,不需要手写post方法、序列化器校验、返回逻辑,代码量精简60%以上:
from rest_framework.generics import CreateAPIView from rest_framework.permissions import IsAuthenticated from .models import Services from .serializers import ServiceSerializer class ServiceAPIView(CreateAPIView): permission_classes = [IsAuthenticated] serializer_class = ServiceSerializer queryset = Services.objects.all()
3. urls.py
无需修改,保持原有配置即可:
urlpatterns = [ path('service/', ServiceAPIView.as_view()), ]
后续扩展提示
如果后续需要新增查询、修改、删除接口,直接替换对应通用视图即可:
- 要同时支持列表查询+新增:替换为
ListCreateAPIView - 要支持单条数据查询/修改/删除:替换为
RetrieveUpdateDestroyAPIView
不需要再重复写基础的请求处理逻辑,适配规模增长的需求。
内容的提问来源于stack exchange,提问作者ahsan mukhtar
相关产品推荐
相关产品推荐

