django rest框架模型序列化器 - 读取嵌套,写入平面

gon*_*one 16 django django-rest-framework

我的情况是我的客户端正在尝试编写包含fk列表的表示

{
languages: [1]
last_name: "Beecher"
settings: 1
state: "NY"
}
Run Code Online (Sandbox Code Playgroud)

但是在阅读时,我希望有一个嵌套的表示来减少往返

{
languages: [{id:1, created:2013-07-21T01:38:33.569Z, modified:2013-07-21T01:38:33.569Z, language:testing}]
last_name: "Beecher"
settings: {
created: "2013-07-20T22:04:17.998Z"
email_blog: false
email_booking_accepted_denied: false
email_booking_request: false
email_friend_joined: false
email_groups_added_network: false
email_new_review: false
email_news: false
email_upcoming_booking_remind: false
id: 1
mobile_booking_accepted_denied: false
mobile_booking_request: false
mobile_friend_joined: false
mobile_groups_added_network: false
mobile_new_review: false
mobile_upcoming_booking_remind: false
modified: "2013-07-20T22:04:18.000Z"
user: 1
}
state: "NY"
}
Run Code Online (Sandbox Code Playgroud)

阅读是使用模型串行和深度= 1没问题-但试图写入给出了一个错误"ValueError异常('实例应该是一个查询集或其他迭代与众多= TRUE’)"当试图检查许多相关领域的国际热核实验堆

相反,关闭深度使得写作工作正如我所愿,但阅读并不好.

有什么我在这里完全不见了?它似乎应该是一个简单的改变,但我只能得到一个或另一个工作

kev*_*ins 5

感谢以前的帖子,我get_serializer_class为此提出了类似的解决方案.

我还希望能够根据方法更改序列化程序类.

首先,我使用字典映射请求方法到序列化程序类向视图类添加了一个属性.

 serializer_classes = {
     'GET': NestedSerializer,
     'POST': FlatSerializer
 }
Run Code Online (Sandbox Code Playgroud)

然后,我定义了一个mixin用于我想要这种行为的地方.

class SwappableSerializerMixin(object):
    def get_serializer_class(self):
        try:
            return self.serializer_classes[self.request.method]
        except AttributeError:
            logger.debug('%(cls)s does not have the required serializer_classes'
                         'property' % {'cls': self.__class__.__name__})
            raise AttributeError
        except KeyError:
            logger.debug('request method %(method)s is not listed'
                         ' in %(cls)s serializer_classes' %
                         {'cls': self.__class__.__name__,
                          'method': self.request.method})
            # required if you don't include all the methods (option, etc) in your serializer_class
            return super(SwappableSerializerMixin, self).get_serializer_class() es
Run Code Online (Sandbox Code Playgroud)


Car*_*son 1

我想到的最简单的事情是覆盖get_serializer_class()POST/PUT 的视图,以返回修改后的序列化器,不指定深度参数并为您的字段使用PrimaryKeyRelatedFieldlanguages