У меня есть поле, которое мне нужно спрятать из пут-пут, которое должно быть там для пут-ов в 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')
< Сильный > ИЗМЕНИТЬ обновленный сериализатор не обновляет данные
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 ответа
Добавьте write_only = True в поле вашего сериализатора
Или
Создайте два сериализатора, один для запроса на получение и один для запроса на размещение. изменить сериализатор на основе метода запроса в методе get_serializer_class представления.
В этом случае вы можете использовать другой сериализатор для 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)
Похожие вопросы
Новые вопросы
python
Python - это многопарадигмальный, динамически типизированный, многоцелевой язык программирования. Он разработан для быстрого изучения, понимания и использования, а также для обеспечения чистого и единообразного синтаксиса. Обратите внимание, что Python 2 официально не поддерживается с 01.01.2020. Тем не менее, для вопросов о Python, связанных с версией, добавьте тег [python-2.7] или [python-3.x]. При использовании варианта Python (например, Jython, PyPy) или библиотеки (например, Pandas и NumPy) включите его в теги.