[英]Django rest api DRF - ViewSet hide a field from get but include for put
I have a field that I need to hide from a get put it needs to be there for a put in a Viewset, how would I achieve this? 我有一个字段需要隐藏在getput中,而该字段需要放置在Viewset中,我该如何实现呢?
my serialiser is as the below, the field stores data as JSON so I need to load it as JSON to perform a get. 我的序列化器如下所示,该字段将数据存储为JSON,因此我需要将其加载为JSON才能执行获取。 but having the original field (routing_data) there on a get will cause a 500 error, so I need to hide it from get.
但是在get上有原始字段(routing_data)会导致500错误,因此我需要将其隐藏在get中。 but when I'm using a put, it will be this field I put into.
但是当我使用看跌期权时,它将是我投入的这一领域。
Thanks 谢谢
serializers.py serializers.py
class MonitoringSerializerRoutingTable(serializers.ModelSerializer):
hostname = serializers.ReadOnlyField(source='device.hostname', )
site_id = serializers.ReadOnlyField(source='device.site_id', )
rt = serializers.SerializerMethodField(source='routing_data',)
use = serializers.ReadOnlyField(source='device_use.use', )
def get_rt(self, instance):
try:
return json.loads(instance.routing_data)
except:
return instance.routing_data
class Meta:
model = DeviceData
fields = ('id','site_id','device_id','hostname','use', 'timestamp', 'rt','routing_data')
views.py views.py
class MonitoringRoutingTableUpload(viewsets.ModelViewSet):
queryset = DeviceData.objects.select_related('device','device_use').order_by('monitoring_order')
serializer_class = MonitoringSerializerRoutingTable
permission_classes = (IsAdminUser,)
filter_class = DeviceData
filter_backends = (filters.SearchFilter,)
search_fields = ('device__hostname','device_use__use')
EDIT the update serialiser doesn't seem to be updating the data 编辑更新序列化程序似乎没有更新数据
class MonitoringRoutingTableUpload(viewsets.ModelViewSet):
queryset = DeviceData.objects.select_related('device','device_use').order_by('monitoring_order')
permission_classes = (IsAdminUser,)
filter_class = DeviceData
filter_backends = (filters.SearchFilter,)
search_fields = ('device__hostname','device_use__use')
def get_serializer_class(self):
serializers = {
create: MonitoringCreateSerializer,
update: MonitoringCreateSerializer,
list: MonitoringSerializerRoutingTable,
retrieve: MonitoringSerializerRoutingTable,
}
return serializers.get(self.action)
serialiezr.py serialiezr.py
class MonitoringSerializerRoutingTable(serializers.ModelSerializer):
hostname = serializers.ReadOnlyField(source='device.hostname', )
site_id = serializers.ReadOnlyField(source='device.site_id', )
rt = serializers.SerializerMethodField(source='routing_data',)
use = serializers.ReadOnlyField(source='device_use.use', )
def get_rt(self, instance):
try:
return json.loads(instance.routing_data)
except:
return instance.routing_data
class Meta:
model = DeviceData
fields = ('id','site_id','device_id','hostname','use', 'timestamp', 'rt')
class MonitoringCreateSerializer(serializers.ModelSerializer):
class Meta:
model = DeviceData
fields = ('id','site_id','device_id','routing_data')
PUT request PUT要求
URL: http://10.66.193.200:8100/api/rt_upload/9/
data: {"routing_data": "[{'subnet': '10.10.0.0/16', 'age': '6w3d', 'next_hop': '10.20.0.0/16'}, {'subnet': '10.30.0.0/16', 'age': '6w3d', 'next_hop': '10.40.0.0/16'}, {'subnet': '10.50.0.0/16', 'age': '6w3d'...}]"}
response from postman: 邮递员的回复:
{
"id": 9,
"site_id": 118,
"device_id": 460,
"hostname": "EDGE",
"use": "Remote Site Connectivity",
"timestamp": "2019-05-31T10:12:58.300252",
"rt": ""
}
Add write_only=True to your serializer field 将write_only = True添加到您的序列化器字段
or 要么
Create two serializers one for get request and one for put request. 创建两个串行器,一个用于获取请求,一个用于放置请求。 change the serializer based on request method inside view's get_serializer_class method.
根据视图的get_serializer_class方法内的request方法更改序列化程序。
In this case, you can use a different serializer for get and for put/post. 在这种情况下,可以对get和put / post使用不同的序列化器。 Create a new serializer with the fields you need, then drop the
serializer_class
attribute and override the get_serializer_class
in the view. 使用所需的字段创建一个新的序列化器,然后删除
serializer_class
属性并在视图中覆盖get_serializer_class
。 Something like this: 像这样:
class MonitoringRoutingTableUpload(viewsets.ModelViewSet):
...
def get_serializer_class(self):
serializers = {
create: MonitoringCreateSerializer,
update: MonitoringCreateSerializer,
list: MonitoringSerializerRoutingTable,
retrieve: MonitoringSerializerRoutingTable,
}
return serializers.get(self.action)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.