Django restframework视图集序列化程序KeyError



我尝试POST请求,但收到KeyError。异常位置:C:\github\dj postgres herok\get_staff\serializers.py,第32行,在create中这是错误位置,那一行就是这个。

def create(self, validated_data):
**profile_data = validated_data.pop('profile')**

我尝试像这样POST数据。在此处输入图像描述在此处输入图像描述

{
"profile":1,
"title": "일단 10만원, 업무 마친 후 바로 입금",
"hourly_pay": 12500,
"start_date": "2020-05-06",
"end_date": "2020-05-09",
"start_time": "09:00:00",
"end_time": "18:00:00",
"content": "간단업무입니다.",
"jobs":[1, 2]
}

这是我的全部代码。型号.py

class GetStaffPost(models.Model):
profile = models.ForeignKey(Profile, null=True, on_delete=models.CASCADE)  # default=1 -> pk=1
title = models.CharField(max_length=30)
jobs = models.ManyToManyField(Job, blank=True)  # tag랑 비슷
hourly_pay = models.IntegerField(null=True)
start_date = models.DateField(null=True)
end_date = models.DateField(null=True)
start_time = models.TimeField(null=True)
end_time = models.TimeField(null=True)
created_at = models.DateTimeField(null=True, auto_now_add=True)
content = models.TextField(default='content')
class Meta:
ordering = ['-created_at'] 
def __str__(self):
return f'{self.pk}: {self.title} - {self.profile.nickname}'

serializers.py

class GetStaffPostSerializer(serializers.ModelSerializer):
profile = serializers.PrimaryKeyRelatedField(read_only=True)
jobs = serializers.PrimaryKeyRelatedField(read_only=True, many=True)
class Meta:
model = GetStaffPost
# fields = ['id', 'profile', 'title', 'jobs', 'hourly_pay', 'start_date', 'end_date',
#           'start_time', 'end_time', 'created_at', 'content']
fields = "__all__"

def create(self, validated_data): # profile, jobs
profile_data = validated_data.pop('profile')
profile_id = profile_data
profile = Profile.objects.get(pk=profile_id)
jobs_data = validated_data.pop('jobs') # list?
post = GetStaffPost.objects.create(**validated_data,
profile=profile)  # Direct assignment to the forward side of a many-to-many set is prohibited. Use jobs.set() instead.
for job_data in jobs_data:
post.jobs.add(Job.objects.get(pk=job_data))
return profile

views.py

class GetStaffPostViewSet(viewsets.ModelViewSet):
queryset = GetStaffPost.objects.all()
serializer_class = GetStaffPostSerializer
def perform_create(self, serializer):
serializer.save()

当POST请求时,我只想写配置文件pk和作业pk列表。不是模型配置文件和作业中的所有字段。当GET请求时,我想显示所有字段。

这是Traceback。

[17/Nov/2021 12:31:43] "GET /get_staff/post/ HTTP/1.1" 200 16613
Internal Server Error: /get_staff/post/
Traceback (most recent call last):a
File "C:githubdj-postgres-herokuvenvlibsite-packagesdjangocorehandlersexception.py", line 47, in inner
response = get_response(request)
File "C:githubdj-postgres-herokuvenvlibsite-packagesdjangocorehandlersbase.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "C:githubdj-postgres-herokuvenvlibsite-packagesdjangoviewsdecoratorscsrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkviewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkviews.py", line 509, in dispatch
response = self.handle_exception(exc)
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkviews.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkviews.py", line 480, in raise_uncaught_exception
raise exc
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkviews.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkmixins.py", line 19, in create
self.perform_create(serializer)
File "C:githubdj-postgres-herokuget_staffviews.py", line 21, in perform_create
serializer.save()
File "C:githubdj-postgres-herokuvenvlibsite-packagesrest_frameworkserializers.py", line 205, in save
self.instance = self.create(validated_data)
File "C:githubdj-postgres-herokuget_staffserializers.py", line 32, in create
profile_data = validated_data.pop('profile')
KeyError: 'profile'

添加配置文件字段read_only=True时,这就是validated_data没有profile键的原因。

在请求正文中设置profile主键,并从profile字段中删除read_only=True

相关内容

最新更新