问题描述
我想将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”。