我的情况是我的客户端正在尝试编写包含fk
列表的表示{
languages: [1]
last_name: "Beecher"
settings: 1
state: "NY"
}
但在阅读时,我希望有一个嵌套表示来减少往返次数
{
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"
}
使用模型序列化程序读取并没有问题,深度= 1 - 但是尝试写入会产生错误“ValueError('实例应该是一个查询集或其他迭代,其中有很多= True')” 尝试检查 iter
的许多相关字段时相反,关闭深度使得写作工作正如我所愿,但阅读并不好。
这里有什么我完全不见了吗?看起来它应该是一个简单的改变,但我只能得到一个或另一个工作
答案 0 :(得分:5)
感谢之前的帖子,我为此提供了基于get_serializer_class
的类似解决方案。
我还希望能够根据方法更改序列化程序类。
首先,我使用字典映射请求方法到序列化程序类向视图类添加了一个属性。
serializer_classes = {
'GET': NestedSerializer,
'POST': FlatSerializer
}
然后,我定义了一个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
答案 1 :(得分:2)
我遇到了同样的问题,看起来很多人也有同样的问题。 Carlton Gibson回答实际上引导我进入我的hacky解决方案。我最终使用了具有深度设置的ModelSerializer并创建了以下mixin以在视图中使用。
class ReadNestedWriteFlatMixin(object):
"""
Mixin that sets the depth of the serializer to 0 (flat) for writing operations.
For all other operations it keeps the depth specified in the serializer_class
"""
def get_serializer_class(self, *args, **kwargs):
serializer_class = super(ReadNestedWriteFlatMixin, self).get_serializer_class(*args, **kwargs)
if self.request.method in ['PATCH', 'POST', 'PUT']:
serializer_class.Meta.depth = 0
return serializer_class
答案 2 :(得分:1)
我遇到的最简单的事情就是在POST / PUT视图上覆盖get_serializer_class()
,以返回修改后的序列化程序,而不是指定深度参数,并为languages
使用PrimaryKeyRelatedField领域。