Django REST Framework - ошибка "Must be Device instance" при вызове PUT из javascript
При попытке обновить экземпляр объекта с помощью PUT, используя фреймворк rest, я получаю ошибку: ValueError: Cannot assign "{'id': UUID('954...8b4')}": "DeviceConfig.device" должен быть экземпляром "Device".
view 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 func FE side:
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. Старый поиск в goog не дал мне ничего хорошего на этот раз, но я не совсем уверен, как отправить экземпляр устройства со стороны клиента, кроме как по его pk что я и пробовал
Я разобрался с этим. @JPG помог указать правильное направление, дело было в сериализаторе - я без необходимости ссылался на device, что все портило. Я удалил его из сериализатора и JS, и теперь все работает хорошо. Спасибо, что направили меня в правильном направлении @JPG
Учитывая, что ссылка на ID устройства уже была в url, который я вызывал, нет необходимости передавать ее снова. Я все еще не совсем уверен, как интерпретировать ошибку (за понимание спасибо), но я думаю, что это была попытка присвоить простой UUID там, где нужен был экземпляр Device, который не обрабатывался в моем коде сериализатора, как я думал.
Поздравления