Django: атрибут объекта не сохраняется / обновляется - PullRequest
1 голос
/ 23 марта 2020

У меня есть следующая модель:

class Device(models.Model):
    #more_code
    supplier = models.ForeignKey(
        Supplier, on_delete=SET_NULL, blank=True, null=True, related_name="devices"
    )

Мне нужна конечная точка исправления, чтобы сменить поставщика с устройства. Все в представлении выглядит, как работает, только device.save () не обновляет состояние объекта

Это мое представление:

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.supplier.name = new_supplier.name
            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.supplier.name = new_supplier.name
            device.save()

        # serializer.save()
    return Response(serializer.data, status=status.HTTP_200_OK)

Мой сериализатор возвращает правильное информация для. Я вижу что-то над головой?

1 Ответ

1 голос
/ 23 марта 2020

Здесь вы обновляете объект supplier новым первичным ключом и новым name:

new_supplier = get_object_or_404(Supplier, pk=request.data.get('supplier'))
for device in devices:
    device.supplier.id = new_supplier.pk
    device.supplier.name = new_supplier.name
    device.save()

Однако я настоятельно советую не изменить первичный ключ старый поставщик (или дубликаты данных). Если вы сделаете это, вы должны сохранить device.supplier.save(), так как вы обновили этот объект.

Но это не очень хорошая практика, так как тогда вы измените этот Supplier объект тогда как вы не хотите менять имя старого поставщика, вы хотите связать device с новым Supplier. Вы можете сделать это, установив внешний ключ supplier_id и сохранить устройство:

supplier_id = request.data.get('supplier')
for device in devices:
    device<b>.supplier_id = supplier_id</b>
    device.save()
...