python - 嵌套序列化程序 Django REST Framework 时排除字段
问题描述
序列化程序.py
class ThreadSerializer(serializers.ModelSerializer):
author = UserSerializer(read_only=True)
last_post_user = UserSerializer(read_only=True)
class Meta:
model = Thread
fields = '__all__'
read_only_fields = ('locked', 'views', 'post_count', 'last_post_time')
class ChannelSerializer(serializers.ModelSerializer):
threads = ThreadSerializer(many=True, read_only=True)
class Meta:
model = Channel
fields = ['id', 'name', 'description', 'category', 'threads']
class CategorySerializer(serializers.ModelSerializer):
channels = ChannelSerializer(many=True, read_only=True)
class Meta:
model = Category
fields = ['id', 'name', 'channels']
您会注意到我在CategorySerializer中嵌套了ChannelSerializer,当我访问使用CategorySerializer查询数据的端点时,我希望它只列出来自ChannelSerializer的数据,但是它也列出了来自ThreadSerializer的数据,我认为这是预期的行为,因为ThreadSerializer嵌套在ChannelSerializer中。
当我嵌套序列化程序时,有什么优雅的方法可以排除字段吗?在这种情况下,我想在使用CategorySerializerthreads
查询数据时排除出现
我尝试了类似问题的答案,但不幸的是,它似乎无法在我的情况下工作,它最终再次列出了线程,我认为有一种更简单的方法可以做到这一点。
解决方案
创建一个不同的序列化程序并删除您不想要的字段(请参阅此答案)是一个更好的选择,但这里有一个替代方案:
class CategorySerializer(serializers.ModelSerializer):
channels = ChannelSerializer(many=True, read_only=True)
# Override so we can remove unwatned fields
def to_representation(self, instance):
rep = super().to_representation(instance)
del rep["channels"]["threads"]
return rep
...
在这种情况下,“threads”键不会出现在 API 的响应中,但为每个通道返回线程的查询仍将运行(换句话说,它可以工作,但性能较差)。
推荐阅读
- ios - NETunnelProviderSession startTunnel() 不启动 VPN 连接
- node.js - 如何选择流中的特定块来使用 Axios 和 nodejs
- javascript - 我们如何使用 express 在 nodeJS 中实现管理面板?
- angular - Angular Reactive 表单部分表单提交
- javascript - 24 小时后使用 Cloud Functions 从 Firestore 中删除消息
- javascript - view.goTo 地图呈现空白 arcgis
- regex - Python 正则表达式 - {e<=1} 发生了什么?
- javascript - 计算网站新访问者的最简单方法
- pine-script - Ma Crossover 有很多滞后
- c++ - 释放由全局替换运算符 new 返回的指针,而不调用替换运算符 delete 是未定义的行为吗?(C++17)