python-3.x - 将带有源属性的已验证数据传递回嵌套序列化程序
问题描述
场景:我有一个包含嵌套序列化程序的序列化程序,我想在该嵌套序列化程序上使用create函数,以便将我的业务逻辑保存在一个地方。
问题:因为嵌套序列化程序使用字段的源属性,validated_data
父序列化程序上的包含模型字段而不是序列化程序字段名称。当我将其传回时,验证失败
例子:
class FooSerializer():
foo_amount = serializers.IntegerField(source='foo_quantity')
class Meta:
class = Foo
fields = ('foo_amount')
def create(self, validated_data):
# Some business logic
class BarSerializer():
foo = FooSerializer()
class Meta:
class = Bar
fields = ('foo')
def create(self, validated_data):
foo_serializer = FooSerializer(validated_data.pop('foo'))
# Always going to fail because validated_data has 'foo_quantity' as a key
if foo_serializer.is_valid():
foo = foo_serializer.save()
解决方案
我不确定是否有更好的方法来解决这个问题,但我发现我可以将initial_data
其用作验证器的数据源。
所以离开上面的例子,我的解决方案是:
class BarSerializer():
foo = FooSerializer()
class Meta:
class = Bar
fields = ('foo')
def create(self, validated_data):
foo_serializer = FooSerializer(initial_data.get('foo'))
if foo_serializer.is_valid():
foo = foo_serializer.save()
推荐阅读
- python - 如何将画布分配给 Kivy 中的多个小部件
- java - Java 2D 游戏内存泄漏
- chef-infra - ChefSpec 测试目录存在
- python - 如何编写一个 Django ORM 查询,其中选择表与另一个表共享一个公共列?
- android - 如何使用 tensorflow lite 在分类对象周围绘制边界框?
- android - 带有导航架构组件的 ViewPager
- javascript - 用php发送图片?
- javascript - 如何从可观察对象中映射新的对象数组?
- javascript - 根据先前下拉菜单的选择,制作所需的下拉菜单
- mysql - 如何根据连接查询中的一列返回最大行?