У меня следующая ситуация. Мне нужна патч для моей модели устройства, чтобы сменить поставщика. Когда пользователь устанавливает параметр устройства на «ВСЕ», все устройства должны быть изменены. Все работает, но мой сериализатор не возвращает моего поставщика в качестве проверенных данных, когда пользователь хочет, чтобы ВСЕ устройства были изменены, потому что это поле много = true.
Это мой патч:
def patch(self, request, site_pk):
"""
PATCH the device's supplier info of the site.
"""
all_device_token = False
if request.data.get("device") == "ALL":
all_device_token = True
arguments = {}
else:
device_pk = request.data.get("device")
arguments = {"id": device_pk}
devices = Device.objects.filter(site_id=site_pk, **arguments).all()
if not devices.exists():
raise PermissionDenied("The device does not belong to the site.")
if all_device_token:
serializer_class = self.get_serializer_class()
serializer = serializer_class(
devices, many=True, data=request.data, partial=True,
)
serializer.is_valid(raise_exception=True)
new_supplier = get_object_or_404(Supplier, pk=request.data.get("supplier"))
for device in devices:
device.supplier_id = new_supplier.pk
device.save()
else:
device = devices.first()
serializer_class = self.get_serializer_class()
serializer = serializer_class(device, data=request.data, partial=True,)
serializer.is_valid(raise_exception=True)
if "supplier" in self.request.data:
new_supplier = serializer.validated_data["supplier"]
device.supplier_id = new_supplier.pk
device.save()
return Response(serializer.data, status=status.HTTP_200_OK)
Сериализатор:
class AdminDeviceInfoSerializer(AdminDeviceSerializer):
site = serializers.SerializerMethodField()
owner = serializers.SerializerMethodField()
country = serializers.SerializerMethodField()
class Meta(AdminDeviceSerializer.Meta):
fields = AdminDeviceSerializer.Meta.fields + [
"site",
"owner",
"country",
"disk_space",
"supplier",
]
def to_representation(self, device):
data = super().to_representation(device)
if not device.supplier:
data["supplier"] = None
data["supplier"] = SupplierSerializer(device.supplier).data
return data
class AdminSiteDevicePatchSerializer(AdminDeviceInfoSerializer):
class Meta(AdminDeviceInfoSerializer.Meta):
fields = AdminDeviceInfoSerializer.Meta.fields