Отправить запрос с объектом через сериализатор many=False
Я пытаюсь сделать POST
запрос с объектом, например, вот как я отправляю свой запрос :
{
"title": "Haloween",
"body": " This is one of the greatest ones",
"grade_level": {
"id": 2,
"country": "UG"
},
"tags": [{"name": "Jamming"}]
}
Я хотел разместить объект :
"grade_level": {
"id": 2,
"country": "UG"
}
и ниже приведен мой сериализатор, который я использую :
class GradeClassSerializer(CountryFieldMixin, serializers.ModelSerializer):
"""GradeClass Serializer."""
class Meta:
model = ClassGrade
fields = ('id', 'grade', 'country', 'color_code', )
class PostSerializer(serializers.ModelSerializer):
"""Post Serializer"""
owner = UserProfile(read_only=True)
tags = TagSerializer(many=True)
comments = CommentSerializer(many=True, read_only=True)
slug = serializers.SlugField(read_only=True)
grade_level = GradeClassSerializer(many=False)
Когда я отправляю объект grade_level
, я не могу получить его, он получает только id :
def create(self, validated_data):
"""Create a blog post in a customized way."""
grade_level = validated_data.pop('grade_level', {})
status = validated_data.pop('status', '')
post = Post.objects.create(**validated_data,
owner=self.context['request'].user)
if grade_level:
grade = ClassGrade.objects.get(id=grade_level['id'])
post.grade_level = grade
post.save()
return post
Когда я делаю запрос, вот что происходит :
KeyError: 'id'
Объект поставляется только с country
без id
.
Вот что печатает grade_level = validated_data.pop('grade_level', {})
:
OrderedDict([('country', 'UG')])
Как получить id
от объекта.
ПРИМЕЧАНИЕ:
- id не помечен как read_only
По умолчанию DRF будет использовать поля модели в ModelSerializer, если вы не определите поле. Поскольку Id является автоматически созданным первичным ключом (Django делает это, если вы не переопределите его явно), а Django предполагает, что первичный ключ доступен только для чтения, id будет опущен из десериализованного запроса
По умолчанию DRF рассматривает id (PrimaryKey) внутри ModelSerializer как доступный только для чтения. Поэтому, чтобы отменить это поведение, вы можете попробовать PrimaryKeyRelatedField
class GradeClassSerializer(CountryFieldMixin, serializers.ModelSerializer):
"""GradeClass Serializer."""
id = serializers.PrimaryKeyRelatedField(queryset=ClassGrade.objects.all(),
required=True)
class Meta:
model = ClassGrade
fields = ('id', 'grade', 'country', 'color_code', )