我一直在嘗試使用DRF序列化/反序列化一些數據,但我不確定發生了什麼問題。如何正確序列化與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實例和每個相關實例。
謝謝,夥計們!