2014-01-20 60 views
0

所以我在看django rest_framework relatedfield,我想出了一個問題,在序列化具有以下架構模型:Django的rest_framework關係

class FooBar(models.Model): 
    foo_flag = models.BooleanField(default=False) 
    foo = models.Foreignkey(Foo, null=True, blank=True) 
    bar_flag = models.BooleanField(default=False) 
    bar = models.Foreignkey(Bar, null=True, blank=True) 
    #... 

我不敢說我​​的FooSerializerBarSerializer如果他們是空的。我想到了我的創建與FooBarSerializer作爲serializer method fields例如:

class FooBarSerializer(serializers.ModelSerializer): 
    foo = serializers.SerializerMethodField('foo_info') 
    bar = serializers.SerializerMethodField('bar_info') 

    class Meta: 
     model = FooBar 

    def foo_info(self, obj): 
     if obj.foo_flag: 
      return FooSerializer() 
     else: 
      return False 

    def bar_info(self, obj): 
     if obj.bar_flag: 
      return BarSerializer() 
     else: 
      return False 

但我真的不知道,如果真的是有後臺的區別,當涉及到SerializerMethodFieldRelatedField在這種情況下最好的做法是什麼?

+0

你想用標誌和字段做什麼?我不清楚你爲什麼使用MethodField開始... – gabrtv

回答

1

嘗試:

class FooBarSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = FooBar 
     depth = 1 

看起來你是嵌套的序列化,在序列化FooBar的包含Foo和Bar車型的系列化申述後。這將反過來將Foo和Bar序列化爲serializers.ModelSerializer

如果您需要自定義Foo或Bar的序列化,那麼創建FooSerializerBarSerializer類是正確的。現在,您需要將其連接到FooBarSerializer,那麼試試這個:

class FooBarSerializer(serializers.ModelSerializer): 
    foo = FooSerializer(required=False) 
    bar = BarSerializer(required=False) 

    class Meta: 
     model = FooBar 

延伸閱讀:

  • depth屬性documentation
  • required=False築巢documentation
  • 下面是允許用空關係issue嵌套序列化器,自2.1.14以來它一直在REST框架中。
+0

這太棒了。我需要檢查一切,但如果一切正常,我會接受。我確實有一個疑問......如果我想向「Foo/BarSerializer」中的'data'添加信息,我該怎麼做? –

+0

一些選項:你可以添加[extra fields](http://www.django-rest-framework.org/api-guide/serializers#specifying-fields-explicitly),[extra context](http:// www。 django-rest-framework.org/api-guide/serializers#including-extra-context)或使用'transform_ '自定義字段值。 – JCotton