【发布时间】:2014-06-11 04:52:22
【问题描述】:
我一直在尝试使用 DRF 序列化/反序列化一些数据,但我不确定出了什么问题。
这是我的模型:
from django.db import models
class FooA(models.Model):
propA = models.CharField(max_length=30)
class FooB(models.Model):
propB = models.CharField(max_lenght=30)
propC = models.ForeignKey(FooC, related_name='fooBs')
class FooC(models.Model):
propC = models.CharField(max_lenght=30)
fooAs = models.ManyToMany(FooA, null=True, blank=True)
这是我的序列化程序:
from rest_framework import serializers
from myModule import models
class FooASerializer(serializers.ModelSerializer):
class Meta:
model = models.FooA
fields = ('propA',)
class FooBSerializer(serializers.ModelSerializer):
class Meta:
model = models.FooB
fields = ('propB',)
class FooCSerializer(serializers.ModelSerializer):
fooBs = FooBSerializer(many=True)
fooAs = FooASerializer(many=True, required=False)
class Meta:
model = models.FooC
fields = ('fooAs', 'fooBs',)
这是我的“观点”:
from rest_framework import generics
from .serializers import FooCSerializer
from .models import FooC
class FooCList(generics.ListCreateAPIView):
model = FooC
serializer_class = FooCSerializer
最后,这是我的路线:
from django.conf.urls import patterns, url, include
from .views import FooCList
urlpatterns = patterns('',
url(r'^foocs/', FooCList.as_view())
)
所以,我想做的是通过管理界面创建一些数据,然后转到 DRF api 浏览器,复制一个 FooC 对象的 JSON,稍微修改它并测试我是否能成功将其反序列化为 FooC 对象。
这是我所做的:
>>> from rest_framework.compat import BytesIO
>>> from rest_framework.parsers import JSONParser
>>> from myApp.serializers import FooCSerializer
>>>
>>> content = '<slightly modified JSON copied from the DRF api browser>'
>>> stream = BytesIO(content)
>>> data = JSONParser().parse(stream)
>>> serializer = FooCSerializer(data=data)
>>> serializer.is_valid()
True
>>> serializer.save()
ValueError: Cannot add "<FooA: fooA>": instance is on database "default", value is on database "None"
请注意,它确实在我的数据库中创建了一个新的 FooC 实例,但它没有创建它的任何“嵌套”类(也就是 FooC 与之有关系的类)。
所以这里有几个问题:
1) 这是预期的吗?我希望它会“级联”创建所有内容。
2) 如果这是设计使然,我在构建客户端时应该如何操作? 我的意思是,我希望打开一个表单,我可以在其中创建 FooC 和所有相关的实例同一个表单中的实例。
谢谢你们!
【问题讨论】:
标签: python django rest serialization django-rest-framework