当尝试使用rest框架使用PUT更新对象实例时,我得到一个错误:ValueError:无法赋值"{'id': UUID('954…8b4')}";必须是"设备"。实例。
视图defn:
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函数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谷歌搜索没有出现太多的我这次,但我不太确定如何从客户端发送一个设备实例,除了它的pk这是我尝试过的
EDIT - DeviceConfigSerializer
class DeviceConfigSerializer(serializers.HyperlinkedModelSerializer):
device = serializers.UUIDField(source='device.id')
class Meta:
model = DeviceConfig
fields = ('device','bpm', 'duty','ledState','pressureMax')
我算出来了。@JPG帮助指出了正确的方向,它是序列化器-我是不必要的引用设备,这把事情搞砸了。我已经从序列化器和JS中删除了它,现在一切都工作得很好。谢谢你给我指出正确的方向@JPG
给定对设备ID的引用已经在我调用的url中,没有必要再次传递它。我仍然不太确定如何解释错误(洞察力赞赏),但我的想法是,它试图分配一个普通的UUID,它需要一个设备实例,这不是在我的序列化器代码中处理,因为我认为它是。
欢呼