Django rest api DRF - ViewSet скрыть поле от get, но включить для put - PullRequest
0 голосов
/ 31 мая 2019

У меня есть поле, которое мне нужно скрыть от пут-позиции, оно должно быть там для пута в Viewset, как бы мне этого добиться?

мой сериализатор, как показано ниже, поле хранит данные в формате JSON, поэтому мне нужно загрузить их как JSON для выполнения получения. но наличие исходного поля (routing_data) на get приведет к ошибке 500, поэтому мне нужно скрыть его от get. но когда я использую пут, в это поле я помещаю.

Спасибо

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

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 обновляющий сериализатор не обновляет данные

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

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

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'...}]"}

ответ почтальона:

{
    "id": 9,
    "site_id": 118,
    "device_id": 460,
    "hostname": "EDGE",
    "use": "Remote Site Connectivity",
    "timestamp": "2019-05-31T10:12:58.300252",
    "rt": ""
}

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Добавить write_only = True в поле вашего сериализатора

или

Создайте два сериализатора, один для запроса на получение и один для запроса на размещение. изменить сериализатор на основе метода запроса в методе get_serializer_class представления.

0 голосов
/ 31 мая 2019

В этом случае вы можете использовать другой сериализатор для get и для put / post.Создайте новый сериализатор с нужными полями, затем удалите атрибут serializer_class и переопределите get_serializer_class в представлении.Как то так:

class MonitoringRoutingTableUpload(viewsets.ModelViewSet):
    ...
    def get_serializer_class(self):
        serializers = {
            create: MonitoringCreateSerializer,
            update: MonitoringCreateSerializer,
            list: MonitoringSerializerRoutingTable,
            retrieve: MonitoringSerializerRoutingTable,
        }
        return serializers.get(self.action)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...