'collections.OrderedDict' object has no attribute 'id'

Viewed 569

My Models related with foreign key:

class Speaker(models.Model):
    speaker = models.ForeignKey(User, on_delete=models.CASCADE)

class Course(models.Model):
    ...
    author = models.ForeignKey(Speaker, on_delete=models.CASCADE, 
    related_name='course_author')

My serializers:

class SpeakerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Speaker
        fields = ['id',...]

class CourseSerializer(serializers.ModelSerializer):
    ....
    author = SpeakerSerializer(many=False, required=True)
    ....
    class Meta:
        model = Course
        fields = ['id', 'author',...]

    def create(self, validated_data):
        ...
        author = validated_data.get('author')
        ...
        course, _ = Course.objects.create(author=author.id, **validated_data)

        course.save()

I'm sending POST request to this serializer and getting this response: Help please!

course, _ = Course.objects.create(author=author.id, **validated_data)
AttributeError: 'collections.OrderedDict' object has no attribute 'id'
2 Answers

Try:

author_id = validated_data.pop('author').get('id')

and make sure you send a correct nested JSON API.

Instead of 'author.id', please use author['id'] to fetch the value to id in OrderdDic object.

Related