【问题标题】:POST and PATCH operations in ArrayModelField using Django DRF使用 Django DRF 在 ArrayModelField 中进行 POST 和 PATCH 操作
【发布时间】:2019-12-20 15:06:35
【问题描述】:

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

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

下面是代码sn-p。

POST API 数据示例

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

models.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

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

viewsets.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

【问题讨论】:

    标签: django django-rest-framework djongo


    【解决方案1】:

    我建议你阅读Writable nested representations上的文档,这将有助于打消你的疑虑。

    【讨论】:

      猜你喜欢
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多