django rest框架嵌套对象获取或创建行为

时间:2014-02-17 12:11:26

标签: django django-rest-framework

我正在使用django-rest-framework为特定的json输入创建一个api端点。我有两个相关的模型(假设帖子只能有一个类别):

class Category(models.Model):
    name = models.CharField(max_length=10)
    slug = models.SlugField()


class Post(models.Model):
    category = models.ForeignKey()
    title = models.CharField(max_length=100)
    text = models.CharField(max_length=256)

我的序列化器是简单的模型序列化器:

class CategorySerializer(ModelSerializer):
    id = serializers.IntegerField(required=True)

    class Meta:
        model = Category


class PostSerializer(ModelSerializer):
    id = serializers.IntegerField(required=True)
    category = CategorySerializer()

    class Meta:
        model = Post

我的api观点也非常简单:

class PostAPIView(mixins.CreateModelMixin, GenericAPIView):
    serializer_class = PostSerializer
    permission_classes = (IsAuthenticated,)

现在为了创建帖子我需要解析一个像这样的json输入:

{
    "id": 10,
    "pk": 10
    "title": "Some title",
    "text": "Some text",
    "category": {
        "id": 15,
        "pk": 15
        "name": "Best category",
        "slug": "best-category"
    }
}

在这里'pk'参数对我来说至关重要,我希望使用json中提供的精确pk在我的数据库上创建数据。现在,如果我发布帖子请求并且没有id为10的帖子和id为15的类别一切正常并且数据写入db新记录插入,但是如果有任何rest-framework返回错误,如[ '帖子ID 10已存在'],我希望根据输入匹配记录更新。我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

您只需添加 UpdateMixin ,只需将其导入为 CreateModelMixin 即可。 这个mixin将实现更新和部分更新方法,这将做你想要的。 但是您无法发送 POST ,因此您需要 PUT PATCH 。您想在 POST 上执行此操作,我建议您实现自己的创建视图方法。