【问题标题】:How to I Fix django.utils.datastructures.MultiValueDictKeyError: in django如何修复 django.utils.datastructures.MultiValueDictKeyError: in django
【发布时间】:2018-03-08 07:02:11
【问题描述】:

当我尝试创建 Employee 的新实例时,出现错误:

django.utils.datastructures.MultiValueDictKeyError: "'bio'"

当我在'EmployeeAddView`类的post方法中print这一行print(request.data)

我明白了:

<QueryDict: {'joining_date': ['2018-03-04'], 'designation': ['1'], 'csrfmiddlewaretoken': ['5AeZ7lFOE2Z5j8cPNNZtygh208Esw65tvf5fzka56nCAj1oUFWCR3fcNHuOok2JK'], 'bio.marital_status': ['1'], 'bio.preferred_language': ['English'], 'tax_id_number': ['333333333ed'], 'bio.birthday': ['2018-03-04'], 'bio.user.first_name': ['Jack'], 'department': ['2'], 'bio.user.last_name': ['Sparrow'], 'bio.phone_number': ['9999999'], 'bio.main_id_type_no': ['459opppp'], 'bio.id_type': ['1'], 'bio.gender': ['1'], 'account_number': ['qwwwwwwww3r3']}>
Internal Server Error: /hr/employee_add/
Traceback (most recent call last):
  File "/usr/local/lib/python3.5/dist-packages/django/utils/datastructures.py", line 83, in __getitem__
    list_ = super(MultiValueDict, self).__getitem__(key)
KeyError: 'bio'

我有这个views.py

class EmployeeAddView(generics.CreateAPIView):
    queryset=Employee.objects.all()
    serializer_class=EmployeeSerializer

    def post(self, request, format=None):
        print(request.data)
        designation = Group.objects.get(id=self.request.data['designation'],)
        department = Group.objects.get(id=self.request.data['department'],) 
        bio = Bio.objects.get(id=self.request.data['bio'],)       
        employee = Employee.objects.create(
            tax_id_number=request.data['tax_id_number'],
            account_number=request.data['account_number'],
            joining_date=request.data['joining_date'],
            designation =designation,
            department =department,
            bio=bio,

            )

        return Response(status=status.HTTP_201_CREATED) 

然后我创建了一个这样的序列化程序:

# Nest Bio With User seriializer
class EmployeeSerializer(serializers.ModelSerializer):
    # TODO: Define serializer fields here
    bio = BioSerializer()
    #user = UserSerializer()
    class Meta:
        model = Employee
        # fields = ['user','tax_id_number','account_number','joining_date','designation','department','gender','marital_status','id_type','birthday','ethnicity','preferred_language','phone_number','em_contact','address']
        fields = '__all__'

【问题讨论】:

  • 可以添加您尝试发布的请求正文吗?是否包含bio
  • 您的request.data 中没有名为biokey
  • 您在 request.data 中没有生物密钥。试试这个——>bio = Bio.objects.get(id=self.request.data['bio.id_type'][0])

标签: django python-3.x serialization django-rest-framework


【解决方案1】:

在您的 views.py 文件中更新您的代码,如下所示

def post(self, request, format=None):
    print(request.data)
    designation = Group.objects.get(id=self.request.data.get('designation',None),)
    department = Group.objects.get(id=self.request.data.get('department', None),) 
    bio = Bio.objects.get(id=self.request.data.get('bio', None),)
    if designation and department and bio:
        employee = Employee.objects.create(
        tax_id_number=request.data['tax_id_number'],
        account_number=request.data['account_number'],
        joining_date=request.data['joining_date'],
        designation =designation,
        department =department,
        bio=bio,
        )

如果键丢失或键没有值,更新行为 bio = Bio.objects.get(id=self.request.data.get('bio', None),) 将为您提供无值,但它不会给你 MultiValueDictKeyError。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 2019-03-21
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2023-01-01
    • 2019-07-15
    相关资源
    最近更新 更多