Django:对象属性不是 saving/updating
Django: Object attribute not saving/updating
我有以下型号:
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)
我的序列化程序正在返回正确的信息。
我看到头顶上有东西吗?
您在这里使用新的主键和新的 name
:
更新 supplier
对象
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
object 然而,您不想更改旧供应商的名称, 你想 link 的 device
到一个新的 Supplier
。您可以通过设置 supplier_id
外键来实现,并保存设备:
supplier_id = request.data.get('supplier')
for device in devices:
device<b>.supplier_id = supplier_id</b>
device.save()
我有以下型号:
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)
我的序列化程序正在返回正确的信息。 我看到头顶上有东西吗?
您在这里使用新的主键和新的 name
:
supplier
对象
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
object 然而,您不想更改旧供应商的名称, 你想 link 的 device
到一个新的 Supplier
。您可以通过设置 supplier_id
外键来实现,并保存设备:
supplier_id = request.data.get('supplier')
for device in devices:
device<b>.supplier_id = supplier_id</b>
device.save()