Django Многие = True не работает с to_representation - PullRequest
0 голосов
/ 24 марта 2020

У меня следующая ситуация. Мне нужна патч для моей модели устройства, чтобы сменить поставщика. Когда пользователь устанавливает параметр устройства на «ВСЕ», все устройства должны быть изменены. Все работает, но мой сериализатор не возвращает моего поставщика в качестве проверенных данных, когда пользователь хочет, чтобы ВСЕ устройства были изменены, потому что это поле много = 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...