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

Это сообщение имеет обновление ниже.

В настоящее время у меня есть эти две модели.Я пытаюсь создать работу, используя CreateAPIView.Прежде, чем я покажу вид, вот мои модели

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


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

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

class Serializer_CreateJobCategory(ModelSerializer):
    class Meta:
        model = modelJobCategory
        fields = [
            'description',
        ]

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

    def create(self, validated_data):
        job = modelJob.objects.create(user=user,category=?,...) #How to get category ?
        return job

Теперь это мой взгляд

class CreateJob_CreateAPIView(CreateAPIView):
    serializer_class = Serializer_CreateJob
    queryset = modelJob.objects.all()

    def post(self, request, format=None):
        serializer = Serializer_CreateJob(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

Сейчас я прохожуследующий JSON

{
"category" :{   
             "description": "Foo"   
            },
"description" : "World"
}

Однако я получаю исключение

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

Я столкнулся с тем же вопросом здесь , и там упоминается, что мне нужно определить поле слага, котороеЯ не уверен, где.Любое предложение о том, как я могу это исправить?

Обновление:

Так что мой сериализатор задания Job теперь выглядит следующим образом, но возвращает ошибку

Получена ошибка AttributeError при попытке получить значение для поля category на сериализаторе Serializer_CreateJob.Поле сериализатора может иметь неправильное имя и не соответствовать ни одному атрибуту или ключу в экземпляре modelJob.Исходный текст исключения был: объект «ManyRelatedManager» не имеет атрибута «описание».

class Serializer_CreateJob(ModelSerializer):
    category = serializers.CharField(source='category.description')
    class Meta:
        model = modelJob
        category = Serializer_CreateJobCategory()
        fields = [
            'category',
            'description',
        ]

   def create(self, validated_data):
        category_data = validated_data.pop('category')
        category = modelJobCategory.objects.get(description=category_data['description'])
        job = modelJob.objects.create(description=validated_data["description"])
        job.category.add(category)
        job.save()
        return job

Есть предложения о том, как я могу это исправить сейчас?

Ответы [ 2 ]

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

Можете ли вы попробовать это?

class Serializer_CreateJob(ModelSerializer):
    category = serializers.SlugRelatedField(
        many=True, 
        queryset=modelJobCategory.objects.all(),
        slug_field='description'
    ) 
    class Meta:
        model = modelJob
        fields = [
            'category',
            'description',
        ]
0 голосов
/ 25 апреля 2018

Попробуйте явно определить поле категории и используйте source=category.description, например:

from rest_framework import serializers

class Serializer_CreateJob(ModelSerializer):
    category = serializers.CharField(source='category.description') 
    class Meta:
        model = modelJob
        category = Serializer_CreateJobCategory
        fields = [
            'category',
            'description',
        ]

    def create(self, validated_data):
        category_data = validated_data.pop('category')
        category = Category.objects.get(description=category_data['description'])  
        job = modelJob.objects.create(description=validated_data['description'],category=category,...) #categy object found by it's description
        return job
...