Django嵌套文档序列化器问题

问题描述

我想将json文件存储在mongodb中,使用django rest框架创建并获取

我在下面分享我的代码。此代码将发布的数据插入mongo。 但是当我“获取”数据时,嵌套对象表示为字符串。

我创建了嵌套模型的序列化器并在Root序列化器中定义,但出现错误“无法将ModelSerializer与抽象模型一起使用。”

我想将对象作为json:image

我做了很多研究,但对此一无所获。

    ###########################models.py########################

    from djongo import models

    class nest(models.Model):
        name = models.CharField(max_length=150,blank=True,null=True)
        icon = models.CharField(max_length=150,null=True)

        class Meta:
            abstract = True

    class Root(models.Model):
        #_id = models.ObjectIdField()
        country = models.CharField(max_length=200,null=True)
        country_code = models.CharField(max_length=5,null=True)
        nested = models.EmbeddedField(
            model_container=nest,null=True)
            
    ###########################serializers.py#####################
    from rest_framework import serializers
    from .models import Root

    class RootSerializer(serializers.ModelSerializer):

        class Meta:
            model = Root
            fields = '__all__'
            
    ###########################views.py###########################
    from django.shortcuts import render

    from django.http.response import JsonResponse
    from rest_framework.parsers import JSONParser
    from rest_framework import status

    from .models Root
    from .serializers import RootSerializer
    from rest_framework.decorators import api_view

    @api_view(['GET','POST','DELETE'])
    def root(request):
        if request.method == 'GET':
            first_root = Root.objects.first()
            root_serializer = RootSerializer(first_root,many=False)
            return JsonResponse(root_serializer.data,safe=False)
        elif request.method == 'POST':
            root_data = JSONParser().parse(request)
            root_serializer = RootSerializer(data=root_data)
            if root_serializer.is_valid():
                root_serializer.save()
                return JsonResponse(root_serializer.data,status=status.HTTP_201_CREATED)
            return JsonResponse(root_serializer.errors,status=status.HTTP_400_BAD_REQUEST)

    ###########################urls.py###########################
    from django.conf.urls import url
    from rootApp import views

    urlpatterns = [
        url(r'^api/root$',views.root),]

    #settings.py
    DATABASES = {
        'default': {
            'ENGINE': 'djongo','NAME': 'root_db','HOST': '127.0.0.1','PORT': 27017,}
    }

解决方法

我提到了我的问题,我的问题是嵌套文档通过无法序列化的抽象模型向客户端表示。

以这种方式,如果我要序列化嵌套文档,我不创建抽象模型,但在这一点上,我也不想为此嵌套文档模型创建数据库集合,因此我将模型键入为抽象。

所以我将嵌套模型创建为抽象模型,直到进行迁移并创建与“根”模型相对应的数据库集合为止。

之后,我将嵌套文档模型更改为普通模型。此更改后,我不再迁移。

通过这种方式,代码可以实现我期望的效果。

我认为如果必须再次迁移,则将嵌套文档更改为摘要,然后执行迁移。迁移后,我将再次将此抽象模型更改为普通模型。

也许每个人都知道这一点,或者也许有更多的解决方案。我解决了我的问题,希望这对某人有帮助

代码中的解决方案#####

########################### models.py ################## #######

from djongo import models

isMigrate = False       //added this line

class Nest(models.Model):
    name = models.CharField(max_length=150,blank=True,null=True)
    icon = models.CharField(max_length=150,null=True)

    class Meta:
        abstract = isMigrate        //changed this line. 

class Root(models.Model):
    #_id = models.ObjectIdField()
    country = models.CharField(max_length=200,null=True)
    country_code = models.CharField(max_length=5,null=True)
    nested = models.EmbeddedField(
        model_container=Nest,null=True)
        
###########################serializers.py#####################
from rest_framework import serializers
from .models import Root

class NestSerializer(serializers.ModelSerializer):              # added
    class Meta:                                                 # this
        model = Nest                                            #
        fields = '__all__'                                      # lines

class RootSerializer(serializers.ModelSerializer):

    class Meta:
        model = Root
        fields = '__all__'
        

解决方案:每当您迁移($ python manage.py migration)时,将'isMigrate'变量更改为'True',否则此变量应为'False'。这很重要,因为执行迁移时,我们只想在创建此迁移文件后创建“迁移文件”,该变量可以为“ False”。在操作情况下,此变量也应为“ False”。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...