Django restframework viewset serializer KeyError

Я пытаюсь выполнить POST запрос, но получаю KeyError. Exception Location: C:\github\dj-postgres-heroku\get_staff\serializers.py, строка 32, in create Вот местоположение ошибки, и эта строка такая.

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

Я пытаюсь отправить данные следующим образом. введите описание изображения здесь введите описание изображения здесь

{
"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]
}

Вот весь мой код. models.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 запросе я хочу написать только список profile pk и jobs pk. не все поля в модели Profile и Jobs. А когда запрос 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:\github\dj-postgres-heroku\venv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\viewsets.py", line 125, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\views.py", line 509, in dispatch
    response = self.handle_exception(exc)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\views.py", line 469, in handle_exception
    self.raise_uncaught_exception(exc)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\views.py", line 480, in raise_uncaught_exception
    raise exc
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\views.py", line 506, in dispatch
    response = handler(request, *args, **kwargs)
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\mixins.py", line 19, in create
    self.perform_create(serializer)
  File "C:\github\dj-postgres-heroku\get_staff\views.py", line 21, in perform_create
    serializer.save()
  File "C:\github\dj-postgres-heroku\venv\lib\site-packages\rest_framework\serializers.py", line 205, in save
    self.instance = self.create(validated_data)
  File "C:\github\dj-postgres-heroku\get_staff\serializers.py", line 32, in create
    profile_data = validated_data.pop('profile')
KeyError: 'profile'

После добавления поля профиля read_only=True поэтому validated_data не имеет profile ключа.

Введите profile первичный ключ в тело запроса и удалите read_only=True из поля profile.

Вернуться на верх