【问题标题】:Django REST Framework - "Must be Device instance" error when calling PUT from javascriptDjango REST Framework - 从javascript调用PUT时出现“必须是设备实例”错误
【发布时间】: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


【解决方案1】:

我解决了。 @JPG 帮助指出了正确的方向,它是序列化程序——我不必要地引用了设备,这把事情搞砸了。我已经从序列化程序和 JS 中删除了它,现在一切正常。感谢您为我指明正确的方向@JPG

鉴于设备 ID 的引用已经在我调用的 url 中,无需再次传入。我仍然不太确定如何解释错误(赞赏洞察力),但我的想法是它试图在需要设备实例的地方分配一个普通的 UUID,而我的序列化程序代码中没有像我想象的那样处理它。

干杯

【讨论】:

  • 问题是,当 django 序列化程序为您生成一个字段时,它知道要生成的字段类型以及如何序列化/反序列化该字段。但是,当您对字段进行更改时,它不再匹配,您必须告诉序列化程序如何反序列化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-01
  • 2017-07-05
  • 2019-03-21
  • 2016-10-16
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多