【问题标题】:django rest framework nested objects get or create behaviourdjango rest框架嵌套对象获取或创建行为
【发布时间】:2014-02-17 12:11:26
【问题描述】:

我正在使用 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 返回类似 [ 'Post id 10 已经存在'],我想根据输入更新匹配记录。我该怎么做?

【问题讨论】:

    标签: django django-rest-framework


    【解决方案1】:

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

    【讨论】:

    • 如果我添加 put/patch 则 rest 框架需要我创建的视图的 look_up 字段和模型,并且由于我正在使用此输入处理多个模型,因此我无法提供它们..
    猜你喜欢
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 2012-12-04
    • 2017-10-13
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多