Rest Framework 无法使用外键保存序列化程序

时间:2021-06-17 19:32:47

标签: python django django-rest-framework

我有下一个序列化程序:

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']

这是我的观点:

@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)

我想创建新的 Post 对象,但是当我在表单中传递一个类别 id 时它不起作用,它没有保存我的对象。我尝试将 PostSerializer 中的 create 方法替换为:

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

但这不起作用。使用邮递员 formdata 说,尽管我填写了该类别字段,但它是必需的。 这是我的模型:

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')

1 个答案:

答案 0 :(得分:1)

你需要一个类别对象而不仅仅是一个 id,所以试试这个

@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)

或者你可以在序列化器的 create 方法中做类似的事情