簡體   English   中英

將多個值發布到 django rest 框架中的單個字段?

[英]Posting multiple values to a single field in django rest framework?

我正在使用 Django Rest 框架,我正在嘗試將多個值類型發布到我的序列化程序 class 中的單個字段。 例如,我想在“value”字段下發布“Temp (C)”、“Humidity(%)”、“Pyra(WPM)”的值。

我在我的序列化程序 class 中使用 extra_kwargs 來告訴我的“值”字段接受我發布給它的不同值類型。 但是,當我嘗試使用 Postman 發布時,只會發布第一個匹配字段的值(在本例中為“Temp (C)”),而不是所有其他字段。 我想知道是否有一種方法可以發布所有字段類型,這樣我就不必為我需要的每個值類型發出新的發布請求?

我知道我可以將這些值名稱硬編碼到我的 models.py 和 serializer.py 中,但我需要保持 models.py 現在的樣子。

此外,這是我嘗試發布的 JSON 的示例:

{“節點 ID”:“2”,“溫度(C)”:“22.6”,“濕度(%)”:“29.67”,“Pyra(WPM)”:“118.9”,“系統時間”:“1592287220” "}

這是我得到的回應:

{ "id": 80, "System Time": 1592287220.0, "Node ID": "2", "Temp (C)": 22.6, "units": null, "valueName": null }

模型.py

class DataValueTable(models.Model):
    timestamp = models.FloatField()
    sensorName = models.TextField(null=True)
    valueName = models.CharField(max_length=100, null=True)
    value = models.FloatField()
    units = models.CharField(max_length=100, null=True)

序列化程序.py

class DataValueTableSerializer(serializers.ModelSerializer):
    class Meta:
        model = DataValueTable
        fields = ['id', 'System Time', 'Node ID', 'Temp (C)', 'units', 'valueName']
        extra_kwargs = {
            "Node ID": {"source": "sensorName"},
            "System Time": {"source": "timestamp"},
            "Temp (C)": {"source": "value"},
            "Humidity(%)": {"source": "value"},
            "Pyra(WPM)": {"source": "value"},
        }

    def create(self, validated_data):
        return DataValueTable.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.timestamp = validated_data.get('timestamp', instance.timestamp)
        instance.sensorName = validated_data.get('sensorName', instance.sensorName)
        instance.valueName = validated_data.get('valueName', instance.valueName)
        instance.value = validated_data.get('value', instance.value)
        instance.units = validated_data.get('units', instance.units)
        instance.save()
        return instance

視圖.py

class DataValueTableList(APIView):

    parser_classes = [JSONParser]

    def get(self, request, format=None):
        info = DataValueTable.objects.all()
        serializer = DataValueTableSerializer(info, many=True)
        return Response(serializer.data)

    def post(self, request, format=None):
        serializer = DataValueTableSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

對於其他難以發布多個值的人,請查看bulk_create Django 方法以發布多行數據: https://docs.djangoproject.com/en/3.0/ref/models/querysets/#bulk-create

Bulk_create 並不是我最初想要做的,但它是我遇到的最佳解決方案。 它還顯着提高了發布速度,這是一個巨大的優勢。

如果我了解您的問題,您想為extra_kwargs的每個項目保存一個DataValueTable的實例,您可以執行以下操作:

    def create(self, validated_data):
        for key in self.extra_kwargs.keys():
            data_value = validated_data.get(key)
            if data_value:
                DataValueTable.objects.create(valueName=key, value=data_value, **validated_data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM