首页 > 解决方案 > 使用 Django DRF 在 ArrayModelField 中进行 POST 和 PATCH 操作

问题描述

我正在使用 Django 2.2,MongoDb 和 Djongo。我在 POST 和 PATCH API 中遇到问题。我面临三种问题。

  1. 执行 POST 操作以创建新条目时,API 失败并出现错误:Array items must be Model instances
  2. 在 POST API 中引用 Screenplay 类实例的正确方法是什么。父类的id够吗?
  3. 如何更新场景模型中的特定字段,包括评论中的文本字段?

以下是代码片段。

示例 POST API 数据

{
    "title": "intro1",
    "screenplay": "49423c83-0078-4de1-901c-f9176b51fd33",
    "comments": [
        {
            "text": "hello world",
            "author": "director"
        }
    ]
}

模型.py

import uuid
from djongo import models

class Screenplay(models.Model):
    id = models.UUIDField(primary_key = True, default = uuid.uuid4,editable = False)
    title = models.CharField(max_length=100)

    def __str__(self):
        return self.title

class Comment(models.Model):
    text = models.TextField();
    author = models.TextField();

    def __str__(self):
        return self.author +self.text

class Scene(models.Model):
    id = models.UUIDField(primary_key = True, default = uuid.uuid4,editable = False)
    title = models.CharField(max_length=100)
    screenplay = models.ForeignKey(Screenplay, related_name='scenes', on_delete=models.CASCADE)

    comments = models.ArrayModelField(
        model_container = Comment,
    );

    def __str__(self):
        return self.title

序列化程序.py

from rest_framework import serializers
from planning.models import Scene, Comment

class ScreenplaySerializer(serializers.ModelSerializer):

    class Meta:
        model = Screenplay
        fields = ('id', 'title')

class CommentSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model = Comment
        fields = ('text', 'author')

class SceneSerializer(serializers.HyperlinkedModelSerializer):
    comments = CommentSerializer();

    class Meta:
        model = Scene
        fields = ('id', 'title', 'comments')

视图集.py

from planning.models import Screenplay, Scene, Comment
from .serializers import  ScreenplaySerializer, SceneSerializer, CommentSerializer
from rest_framework import viewsets
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import status
from rest_framework import generics
from rest_framework.generics import RetrieveUpdateDestroyAPIView

class ScreenplayViewSet(viewsets.ModelViewSet):
    queryset = Screenplay.objects.all()
    serializer_class = ScreenplaySerializer

class SceneViewSet(viewsets.ModelViewSet):
    queryset = Scene.objects.all()
    serializer_class = SceneSerializer

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer

标签: djangodjango-rest-frameworkdjongo

解决方案


我建议您阅读有关可写嵌套表示的文档,这将有助于消除您的疑虑。


推荐阅读