【问题标题】:MultiValueDictKeyError in Django REST APIView POST requestDjango REST APIView POST 请求中的 MultiValueDictKeyError
【发布时间】:2022-01-30 04:06:04
【问题描述】:

我正在尝试为游戏 API 编写一个 POST 请求,并从 GET 请求传递一些数据,并通过这个 POST 请求传递一些数据。但是,我不断收到以下错误:

MultiValueDictKeyError 'gameround'

我在这里做错了什么?

    def post(self, request, *args, **kwargs):
        if not isinstance(request.user, CustomUser):
            current_user_id = 1
        else:
            current_user_id = request.user.pk
        gameround = request.GET['gameround']
        random_resource = request.GET['resource']
        created = datetime.now()
        score = 0
        origin = ''
        name = request.POST['name']
        language = request.POST['language']

        user_input_tag = Tag.objects.create(name=name, language=language)
        tag_serializer = TagSerializer(user_input_tag)

        if Tagging.objects.all().filter(tag=user_input_tag).exists():
            # if tagging like this exists, save tagging anyway and leave tag unchanged
            score += 5
            user_input_tagging = Tagging.objects.create(user_id=current_user_id,
                                                        gameround=gameround,
                                                        resource=random_resource,
                                                        tag=user_input_tag,
                                                        created=created,
                                                        score=score,
                                                        origin=origin)

            tagging_serializer = TaggingSerializer(user_input_tagging)

            return Response({'tag and ': tag_serializer.data}, {'tagging': tagging_serializer.data})

        elif not Tagging.objects.all().filter(tag=user_input_tag).exists():
            # save tagging otherwise and del tag?
            user_input_tagging = Tagging.objects.create(user_id=current_user_id,
                                                        gameround=gameround,
                                                        resource=random_resource,
                                                        tag=user_input_tag,
                                                        created=created,
                                                        score=score,
                                                        origin=origin)
            user_input_tagging.save()
            tagging_serializer = TaggingSerializer(user_input_tagging)
            return Response({'tagging only': tagging_serializer.data})

【问题讨论】:

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


    【解决方案1】:

    您的GET 中没有密钥gameround。你可以得到gameround数据

    gameround = request.GET.get('gameround')
    

    如果没有给出默认值,则默认为None

    或者您可以将default值设置为

    gameround = request.GET.get('gameround', '')
    

    【讨论】:

    • 这似乎有效。那么对于 POST 是否同样重要?比如'''name = request.POST.get('name')'''?我添加了这个,它不再抛出任何错误,但只有 {"name":["This field is required."],"language":["This field is required."]}.
    • 是的,它也可以在POST 中使用。最好使用它,因为它不会抛出MultiValueDictKeyError,因为它会设置default 值。否则你必须手动检查key是否存在。
    • 这是因为这里获得的 namelanguage 的值为 null 并且在您的 models.py 中您已将这两个字段都设置为非 null 这就是为什么您在创建新时收到此错误Tag
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 2020-12-07
    • 2020-08-03
    • 2017-07-07
    • 2014-01-11
    • 2018-12-20
    • 2023-01-08
    相关资源
    最近更新 更多