2014-06-11 52 views
2

我一直在嘗試使用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實例和每個相關實例。

謝謝,夥計們!

回答

0

簡答:

1)是的。

2)有可能的解決方法。

爲了讓您理解爲什麼我對第一個問題說「是」,我建議您閱讀由DRF的創始人湯姆克里斯蒂編寫的https://groups.google.com/forum/#!msg/django-rest-framework/vCl2I_EzJnE/qwRdIdxiUe4J的解釋。

現在的解決方法,你既可以:

1)使用pre_save方法中,以創建嵌套對象的循環,然後他們的PK添加到FooC當前實例

2)創建查看您的嵌套類,然後使用您的請求中的相應數據調用該視圖中的方法。

希望這有助於:)

相關問題