2014-01-20 33 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