首页 > 解决方案 > 如何在 Django Rest Framework 中保存外键字段

问题描述

我有一个问题跟踪器项目,经理可以将用户分配给项目。经理从下拉列表中选择一个项目和一个用户,点击提交,然后在前端调用一个 api 调用将发布数据发送到我的 django APIView assignuser。然后,Assignuser 为正确的项目和用户获取这些值和过滤器,并将该用户保存到项目用户。检查项目后,我无法将新用户保存到项目中,因为用户出现为空。在 DRF 中保存外键是否有指定的方法?

分配用户

class assignuser(APIView):
    serializer_class = ProjectSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            user_name = serializer.get('user')
            project_name = serializer.get('project_name')
            user = Users.objects.get(user=user_name)
            project = Project.objects.get(name=project_name)
            project.user = user
            project.save()
            return Response(ProjectSerializer(project).data, status=status.HTTP_201_CREATED)
        else:
            return HttpResponse("Incorrect Credentials")

项目序列化器

class ProjectSerializer(serializers.ModelSerializer):
user = SignUpSerializer()
class Meta: 
    model = Project
    fields = ('name', 'description', 'user')

注册序列化器

class SignUpSerializer(serializers.ModelSerializer):
class Meta: 
    model = Users
    fields = ('username', 'password', 'email', 'role')

标签: djangodjango-modelsdjango-rest-frameworkdjango-viewsdjango-serializer

解决方案


你可以这样做

class assignuser(APIView):
    serializer_class = ProjectSerializer

    def post(self, request, format=None):
        serializer = self.serializer_class(data=request.data)
        if serializer.is_valid():
            user_name = serializer.get('user')
            project_name = serializer.get('project_name')
            user = Users.objects.get(user=user_name)
            project = Project.objects.get(name=project_name)
            project.user = user
            project.user.save()
            return Response(ProjectSerializer(project).data, status=status.HTTP_201_CREATED)
        else:
            return HttpResponse("Incorrect Credentials")

推荐阅读