class StaffViewSet(viewsets.ModelViewSet):
'''
由于ModelViewSet 本身就封装了 GET PUT POST PATCH 如无特殊处理可以直接使用
因为下面使用了一对一 和 多对多 所以重写了 create update destroy
'''
serializer_class = StaffSerializer
queryset = Staff.objects.all()
# filter_backends 封装了djnago filter 根据字段精确查找和根据字段模糊搜索
filter_backends = (DjangoFilterBackend,filters.SearchFilter)
filterset_fields = ['user__realname','employee_number','user__mobile','job_title']
search_fields = ['user__realname','employee_number','user__mobile','job_title']
'''
post
'''
def create(self, request, *args, **kwargs):
department_id = request.data.pop('department_id')
manage = request.data.pop('manage')
user_data = request.data.pop('user')
u_ser = UserSerializer(data=user_data)
u_ser.is_valid(raise_exception=True)
user = User.objects.create(**u_ser.validated_data)
serializer = StaffSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.instance = Staff.objects.create(user=user, **serializer.validated_data)
department = Department.objects.filter(pk=department_id).first()
StaffDepartment.objects.create(staff=serializer.instance,department=department,manage=manage)
headers = super().get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
'''put'''
def update(self, request, *args, **kwargs):
partial = kwargs.get('partial', False)
instance = self.get_object()
user_data = request.data.pop('user', None)
department_id = request.data.pop('department_id')
manage = request.data.pop('manage')
StaffDepartment.objects.filter(staff=instance).update(department=Department.objects.filter(pk=department_id).first(),manage=manage)
if user_data:
user_ser = UserSerializer(instance.user, data=user_data, partial=partial)
user_ser.is_valid(raise_exception=True)
user_ser.save()
return super().update(request, args, kwargs)
'''
delete
'''
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
user = instance.user
user.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
urls.py
from rest_framework import routers
router = routers.DefaultRouter()
router.register('profile', ProfilesView)
path('api-auth/', include('rest_framework.urls')),
path('', include(router.urls)),