【发布时间】:2021-12-06 00:31:39
【问题描述】:
我在尝试使用 PUT 使用 rest 框架更新对象实例时遇到错误: ValueError:无法分配“{'id': UUID('954...8b4')}”:“DeviceConfig.device”必须是“Device”实例。
查看定义:
class DeviceConfigViewSet(viewsets.ModelViewSet):
#todo: secure
authentication_classes = []
queryset = DeviceConfig.objects.all().order_by('device')
def get_queryset(self):
device = self.get_renderer_context()["request"].query_params.get('device')
if device:
return DeviceConfig.objects.filter(device=Device(device=device))[0:]
else:
return self.queryset
serializer_class = DeviceConfigSerializer
DeviceConfig 型号:
class DeviceConfig(models.Model):
device = models.OneToOneField(Device,primary_key=True,on_delete=models.CASCADE)
bpm = models.DecimalField(max_digits=22, decimal_places=3, blank=True, null=True, default=0.5)
duty = models.DecimalField(max_digits=22, decimal_places=4, blank=True, null=True, default=0.022)
ledState = models.IntegerField(
default=255,
validators=[MaxValueValidator(255), MinValueValidator(0)]
)
pressureMax = models.IntegerField( blank=True, null=True, default=70, validators=[MaxValueValidator(255), MinValueValidator(10)])
JS func FE端:
function formSubmit(){
var myForm = document.getElementById("config-form");
var formObj = new FormData(myForm);
var object = {};
formObj.forEach(function(value, key){
object[key] = value;
});
object["device"] = DEVICE_UUID;
const putMethod = {
method: 'PUT',
headers: {
'Content-type': 'application/json; charset=UTF-8' // Indicates the content
},
body: JSON.stringify(object)
}
fetch("http://localhost:81/configs/"+DEVICE_UUID, putMethod);
}
我试过不从前端发送设备 ID,但它给了我 400 这次ol'goog搜索对我来说并没有出现太多,但我不太确定如何从客户端发送设备实例,除了它的pk 这是我尝试过的
编辑 - DeviceConfigSerializer
class DeviceConfigSerializer(serializers.HyperlinkedModelSerializer):
device = serializers.UUIDField(source='device.id')
class Meta:
model = DeviceConfig
fields = ('device','bpm', 'duty','ledState','pressureMax')
【问题讨论】:
-
请添加你的
DeviceConfigSerializer类 -
@JPG 在编辑中添加
标签: javascript django django-rest-framework