You need to enable JavaScript to run this app. 使用Django Serializer向数据库保存数据的更优实现方式咨询
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 00:45:03