无法在POST方法django rest框架中传递kwargs的值

问题描述 投票:0回答:1

当我尝试使用perform_create方法传递course_id的值时,它显示此错误...

ValueError at /course/9f77f4a9-0486-44f3-8bea-4908adb7d3ca/add/
Cannot assign "'9f77f4a9-0486-44f3-8bea-4908adb7d3ca'": "Content.course_id" must be a "Course" instance.
    Request Method: POST
    Request URL:    http://127.0.0.1:8000/course/9f77f4a9-0486-44f3-8bea-4908adb7d3ca/add/
    Django Version: 2.2.5
    Exception Type: ValueError
    Exception Value:    
    Cannot assign "'9f77f4a9-0486-44f3-8bea-4908adb7d3ca'": "Content.course_id" must be a "Course" instance.

这是我的views.py

class ContentAdd(generics.ListAPIView, mixins.CreateModelMixin):
    queryset = Content.objects.all()
    serializer_class = ContentSerializer

    def post(self, request, *args, **kwargs):
        saveData = self.create(request, *args, **kwargs)
        response_data = {}
        response_data["data"] = saveData.data
        response_data["errors"] = {}
        return Response(response_data, status=status.HTTP_201_CREATED)

    def perform_create(self, serializer):
        id = self.kwargs.get("course_id")
        serializer.save(course_id=id)

这是我的serializers.py

class ContentSerializer(serializers.ModelSerializer):
    class Meta:
        model = Content
        fields = [
            'title',
            'description',
            'serial',
            'file',
            'file_type',
        ]

这是我的模特。py

class Content(models.Model):
    content_id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    course_id = models.ForeignKey(Course, on_delete=models.CASCADE, related_name="content_course_id", to_field='course_id')
    file = models.FileField(upload_to=gen_pic_path,blank=False, null=False)
    file_type = models.BooleanField(blank=False, null=False)    # content/attachment
    serial = models.IntegerField()
    title = models.CharField(max_length=200)
    description = models.TextField()

这是网址路径

path('course/<course_id>/add/', ContentAdd.as_view()),
python django django-rest-framework django-generic-views
1个回答
0
投票

您需要获取Course才能保存Content

def perform_create(self, serializer):
    id = self.kwargs.get("course_id")
    course = Course.objects.get(id=id)
    serializer.save(course_id=course)
© www.soinside.com 2019 - 2024. All rights reserved.