PATCH не сохраняет новое состояние объекта - PullRequest
0 голосов
/ 23 марта 2020

Я делаю конечную точку PATCH. Он работает почти нормально ... но не возвращает конечное состояние объекта при возврате его в мой тестовый класс. Так что в моем сериализаторе / просмотре все обновляется, но когда я возвращаю serialiser.data в свой тест, кажется, что мое self.device не обновляется.

Это мой код:

view:

def patch(self, request, site_pk, device_pk):
    """
    PATCH the device's supplier info of the site.
    """
    site_device = Device.objects.filter(site_id=site_pk, pk=device_pk)
    if not site_device.exists():
        raise PermissionDenied("The device does not belong to the site.")
    device = site_device.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 = new_supplier
        device.save()

    serializer.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",
        ]

    @staticmethod
    def get_site(device):
        #somecode

    @staticmethod
    def get_owner(device):
        #somecode

    @staticmethod
    def get_country(device):
        #somecode

    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

тестовый класс:

def test_change_supplier_devices_site(self):
    new_supplier = SupplierFactory(name="STWEB")
    self.client.force_login(self.admin_user)
    url = reverse(
        "admin-site-device-detail",
        kwargs={"site_pk": self.site.pk, "device_pk": self.device_1.pk},
    )
    response = self.client.patch(url, data={"supplier": new_supplier.pk})

    self.assertEqual(response.status_code, status.HTTP_200_OK)
    self.assertEqual(new_supplier.pk, self.device_1.supplier_id)
...