Обновление через пут получило исключение: неверный тип.Ожидаемое значение pk, получено dict - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть следующие две модели

class modelJob(models.Model):
    category            = models.ForeignKey(modelJobCategory,on_delete=models.CASCADE,null=True,default=None,blank=True)
    description         = models.CharField(max_length=200, unique=False)

и эта модель

class modelJobCategory(models.Model):
    name = models.CharField(max_length=200, unique=True)
    other = models.CharField(max_length=200, unique=False , blank=True , null=True)

Это мои два сериализатора

class Serializer_Update_Job_Serializer(ModelSerializer):
    class Meta:
        model = modelJob
        category = Serializer_Create_List_JobCategory
        fields = [
            'category',
            'description',
        ]

class Serializer_Create_List_JobCategory(ModelSerializer):
    class Meta:
        model = modelJobCategory
        fields = [
            'name',
            'other',
        ]

Сейчас я пытаюсь обновитьчерез PUT на URL с полем поиска pk однако я получаю исключение

{
  "category": [
    "Incorrect type. Expected pk value, received dict."
  ]
}

Вот как выглядит мой взгляд

class UpdateJob_RetrieveUpdateAPIView(RetrieveUpdateAPIView):
    queryset = modelJob.objects.all()
    serializer_class = Serializer_Update_Job_Serializer
    lookup_field = 'id'

    def put(self, request, *args, **kwargs):
        object = self.queryset
        return self.update(request, *args, **kwargs)

Любая идея, почему я получаю этоошибка?

Это тело моего PUT

{
    "description": "foobar",

    "category" : {
        "name" : "labor",
        "other" : "blah"
    }

}

1 Ответ

0 голосов
/ 26 апреля 2018

Я считаю, что вам нужно создать метод 'update' в вашем сериализаторе заданий.См. Документацию здесь: http://www.django -rest-framework.org / api-guide / Relations / # Writable-nested-serializers .По умолчанию сериализатор не понимает, как сохранить вложенный сериализатор.

Ваш метод обновления может выглядеть следующим образом:

def update(self, instance, validated_data, id):
    # Perform any updates to the instance you want to do
    # using the validated_data, then save the category
    instance.category = modelJobCategory.objects.get_or_create(
        name=validated_data['category']['name']
    )

Более простой, возможно, более приятный подход - использовать записываемый SlugRelatedField.Таким образом, изменяя ваш сериализатор заданий на обновление, чтобы иметь поле категории, которое выглядит следующим образом:

category = SlugRelatedField(slug_field='name')

Таким образом, когда вы сохраняете задание с его категорией, вы просто отправляете название категории.Не весь объект категории.

Если вы хотите понять, что означает ошибка.Django rest framework пытается выяснить, какую категорию сохранить на работе.Но для этого он использовал бы первичный ключ.Идентификатор базы данных.Целое числоТо, что вы отправляете в своем запросе PUT, - это dict категории с именем и описанием.Но нет идентификатора базы данных.И django не знает, как превратить этот объект словаря в категорию, которую он может сохранить в базе данных для вас.

...