python-3.x - django-restframework。如何在序列化程序中更改多对多字段名称?
问题描述
我知道使用如下参数更改序列化程序中表示的文件名相对简单source
:
class SomeSerializer(ModelSerializer):
alternate_name = serializers.SomeField(source='field_name')
class Meta:
fields = ('alternate_name')
但是在处理多对多字段时,source
is aManyRelatedManager
并source
在其中使用会导致错误:
class SomeModel(models.Model):
field_name = models.ManyToManyField(OtherModel, related_name='groups')
class SomeModelSerializer(ModelSerializer):
alternate_name = models.ListField(source='field_name')
class Meta:
fields = ('alternate_name')
这给出了ManyRelatedManager object is not iterable!
使用其他字段而不是ListField
给出其他错误。这里的正确方法是什么?
解决方案
您可以使用它obj.field_name.filter()
来获取相关数据并从SerializerMethodField()
上述数据中返回。
这就是我会这样做的方式,不确定它是否适合你。
class SomeModel(models.Model):
field_name = models.ManyToManyField(OtherModel, related_name='groups')
class SomeModelSerializer(ModelSerializer):
#name this field whatever you want
some_name = serializers.SerializerMethodField()
# SerializerMethodField gets populated from "get_{filed_name}" method
def get_some_name(self, obj):
#this will return a list
return obj.field_name.filter()
class Meta:
fields = ('some_name')
推荐阅读
- python - 切片列表以使用 Python 删除某些对象
- docker - 不能将参数传递给 awk
- python - 不包含根元素容器时 XSLT 不起作用
- c++ - c++字符串输入奇怪的东西
- html - 如何使用 Flexbox 将块固定到容器的左侧?
- xml - 我如何使用 Xquery 根据 xml 标签中的 policyno 对净金额求和
- javascript - Webpack - 仅包含 jquery 作为特定包文件的插件
- node.js - npm 不支持 Node.js v12.18.3
- csv - 将 csv 文件从云存储批量加载到 bigquery
- python - 在 SQL 中通过 rowid 获取值