CAPSLOCKFURY
CAPSLOCKFURY

Reputation: 31

Rest Framework cant save serializer with foreign key

I have next serializers:

class CategorySerializer(serializers.ModelSerializer):

    class Meta:
        model = Category
        fields = '__all__'


class PostSerializer(serializers.ModelSerializer):
    category = CategorySerializer()

    class Meta:
        model = Post
        fields = ['id', 'title', 'text', 'date', 'category']

And here is my view:

@api_view(['POST'])
def create_post(request):
    serializer = PostSerializer(data=request.data)

    if serializer.is_valid():
        serializer.save()
    else:
        return Response(serializer.errors)
    return Response(serializer.data)

I want to create new Post object, but when I pass an category id at form it does not work, it is not saving my object. I tried to replace create method at my PostSerializer, to this:

    def create(self, validated_data):
        category_id = validated_data.pop('category')
        post = Post.objects.create(**validated_data, category=category_id)
        return post

but this dont work. Using postman formdata it is saying, that category field is required despite I filled it. Here is my models:

class Category(models.Model):
    name = models.CharField(max_length=512)

    def __str__(self):
        return self.name


class Post(models.Model):
    title = models.CharField(max_length=512)
    text = models.TextField()
    date = models.DateTimeField(auto_now_add=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='category')

Upvotes: 3

Views: 598

Answers (1)

Jimmar
Jimmar

Reputation: 4449

You need a category object not just an id, so try this

@api_view(['POST'])
def create_post(request):
    category_id = request.data['category'] # or however you are sending the id
    serializer = PostSerializer(data=request.data)

    if serializer.is_valid():
        category = Category.objects.get(id=category_id)
        serializer.save(category=category)
    else:
        return Response(serializer.errors)
    return Response(serializer.data)

or you can do something similar in the create method of the serializer

Upvotes: 2

Related Questions