需求:
查询的时候返回不包括SharePasswd 字段, 但是新增操作需要用到该字段
再不写多个model模型和序列化器的前提下实现
如果您在查询(GET 请求)时不希望返回 SharePasswd
字段,但在新增(POST 请求)时需要用到该字段,那么您可以在序列化器中处理这种差异。
首先,确保您的序列化器在新增操作中处理 SharePasswd
字段,您可以保留它在 fields
列表中。然后,对于查询操作,您可以重写序列化器的 to_representation
方法,在序列化模型实例为字典时排除 SharePasswd
字段。
废话不多说, 直接上干货代码:
序列化器中关键代码如下:
from rest_framework import serializers
from exfile.sharefilesync.share_file_strategy_models import ShareFilePolicy
class ShareFileSerializer(serializers.ModelSerializer):
"""共享型文件同步 策略管理 """
class Meta: # 查询不返回SharePasswd, 但是新增又需要该列
model = ShareFilePolicy
fields = ('PolicyID', 'PolicyName', 'PolicySwich', 'PolicyLock', 'SyncMode', 'SynCFLOW', 'Protocol', 'SharePort',
'ShareHostIP', 'ShareName', 'ShareUser', 'SharePasswd', 'Priority', 'MountStatus')
def to_representation(self, instance):
# 调用父类的to_representation方法获取整个实例的序列化表示
ret = super().to_representation(instance)
# 检查请求的方法,如果是GET请求,则移除SharePasswd字段
if self.context['request'].method == 'GET':
ret.pop('SharePasswd', None)
return ret
model模型中关键代码:
以上需求可以实现在查询get请求时, 查询结果返回列布包扣sharePasswd字段, 通过postman调用显示如下:
下面通过postman执行新增操作
然后通过去数据库查看结果如下:
可以看到新增的时候SharePasswd又是能成功插入到数据库中的, 至此最上面的需求完美实现, 今天就先写到这, 后续更多实战开发技巧心得陆续更新, 谢谢您的关注!!1