两个Serializer CreateAPIView-Django

时间:2019-02-18 12:15:03

标签: django django-models django-forms django-rest-framework django-views

我创建了一个下面的视图。类似,我必须创建CreateAPIView。在下面的EmployeeAddView中,我拿了两个forms并根据数据添加了数据。但是我没有在REST API中做到这一点。

@login_required
def EmployeeAddView(request):

    # Tab Opts Checking
    if request.user.userprofile.user_company.company_tab_opts:
            return redirect('admin_employee')

    if request.method == 'POST':
        random_password = User.objects.make_random_password() # generate password here 
        ur_form = EmployeeRegisterForm(request.POST, pwd=random_password)
        pr_form = EmployeeProfileForm(request.POST, request.FILES, user_company=request.user.userprofile.user_company.id)

        user_role = ACLRoles.objects.get(id=4)

        if ur_form.is_valid() and pr_form.is_valid():

            new_user = ur_form.save(commit=False)            
            new_user.username = new_user.email
            new_user.set_password(random_password)
            new_user.save()

            profile =  pr_form.save(commit=False)
            if profile.user_id is None:
                profile.user_id = new_user.id
                profile.user_role_id = user_role.id
                profile.user_company_id = request.user.userprofile.user_company.id
            profile.save()

            for group in request.POST.getlist('user_groups'): # For many to many field
                profile.user_groups.add(group)

            email= ur_form.cleaned_data.get('email')
            messages.success(request, 'Employee Added - %s!' % email)
            return redirect('admin_employee')

    else:
        ur_form = EmployeeRegisterForm(use_required_attribute=False)
        pr_form = EmployeeProfileForm(user_company=request.user.userprofile.user_company.id, use_required_attribute=False)

    return render(request, 'employee/employee_form.html', {'ur_form': ur_form, 'pr_form': pr_form})

这是我的尝试,但我不知道如何去做 API-views.py

class EmployeeAddAPIView(generics.CreateAPIView):
    queryset = User.objects.all()
    serializer_class = EmployeeRegisterSerializer
    permission_classes = [UserIsAuthenticated]

    def perform_create(self, serializer):
        serializer.save(
            userprofile__user_company = self.request.auth.application.company,
      )

API-Serializer.py

class EmployeeProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = UserProfile
        fields = [  'user_employee_id',
                    'user_phone', 
                    'user_payroll_id',
                    'user_hire_date',
                    'user_pay_rate',
                    'user_salaried',
                    'user_excempt',
                    'user_groups',
                    'user_state',
                    'user_city',
                    'user_zipcode', 
                    'user_status',
        ]

class EmployeeRegisterSerializer(serializers.ModelSerializer):
    userprofile = EmployeeProfileSerializer(read_only=True)

    class Meta:
        model = User
        fields = ['first_name','last_name', 'email', 'userprofile']

我应该怎么做。

我做了这样的事情

    from rest_framework.views import APIView
from rest_framework import status

    class EmployeeAddAPIView(APIView):

        def post(self, request, *args, **kwrgs):

            serializer1 = EmployeeRegisterSerializer(data=request.data)
            serializer2 = EmployeeProfileSerializer(data=request.data)

            user_role = ACLRoles.objects.get(id=4)

            if serializer1.is_valid():
                print('inside')
                new_user = serializer1.save(commit=False)            
                new_user.username = new_user.email
                new_user.set_password(random_password)
                new_user.save()

                profile =  serializer2.save(commit=False)
                if profile.user_id is None:
                    profile.user_id = new_user.id
                    profile.user_role_id = user_role.id
                    profile.user_company_id = self.request.auth.application.company
                profile.save()


                return Response(status=status.HTTP_200_OK)
            print('outside', serializer1)
            return Response(status=status.HTTP_200_OK)

1 个答案:

答案 0 :(得分:1)

您可以添加2个序列化程序,就像添加2个表格一样

在serailizer.py

class Model1SerailizerOne(serializer.ModelSerializer):
    # code

class Model2SerailizerTwo(serializer.ModelSerializer):
    # code

在api.py

class APICreateView(APIView):

  def post(self, request, *args, **kwrgs):

      serializer1 = Model1SerailizerOne(data=request.data)
      serializer2 = Model2SerailizerTwo(data=request.data)

      if serializer1.is_valid() and serializer2.is_valid():

           # save code
         return ....

希望有帮助

这将起作用-

class EmployeeAddAPIView(APIView):
    permission_classes = [UserIsAuthenticated]
    def post(self, request, *args, **kwrgs):

        serializer1 = EmployeeRegisterSerializer(data=request.data)
        serializer2 = EmployeeProfileSerializer(data=request.data)

        user_role = ACLRoles.objects.get(id=4)

        if serializer1.is_valid():

            print(serializer1.validated_data['email'])
            user = serializer1.save(
                username = serializer1.validated_data['email'],
            )

            random_password = User.objects.make_random_password()
            obj = get_object_or_404(User, pk=user.id)
            obj.set_password(random_password)
            obj.save()

            print(serializer1.errors)

            if serializer2.is_valid():
                serializer2.save(
                    user_id = user.id,
                    user_company_id = self.request.auth.application.company.id,
                    user_role_id = user_role.id
                )

            return Response(status=status.HTTP_200_OK)

        return Response(status=status.HTTP_404_NOT_FOUND)