Python 在django rest框架中向单个字段发布多个值?

Python 在django rest框架中向单个字段发布多个值?,python,django,django-rest-framework,postman,serialization,Python,Django,Django Rest Framework,Postman,Serialization,我正在使用Django Rest框架,并试图将多个值类型发布到序列化器类中的单个字段中。例如,我想在“值”字段下发布“温度(C)”、“湿度(%)”和“Pyra(WPM)”的值 我在序列化程序类中使用额外的_kwargs来告诉我的“value”字段接受我发布到它的不同值类型。但是,当我尝试使用Postman发布时,只有第一个匹配字段的值(在本例中为“Temp(C)”)将被发布,而不是所有其他字段。我想知道是否有一种方法可以发布所有字段类型,这样我就不必为我需要的每个值类型发出新的post请求 我知

我正在使用Django Rest框架,并试图将多个值类型发布到序列化器类中的单个字段中。例如,我想在“值”字段下发布“温度(C)”、“湿度(%)”和“Pyra(WPM)”的值

我在序列化程序类中使用额外的_kwargs来告诉我的“value”字段接受我发布到它的不同值类型。但是,当我尝试使用Postman发布时,只有第一个匹配字段的值(在本例中为“Temp(C)”)将被发布,而不是所有其他字段。我想知道是否有一种方法可以发布所有字段类型,这样我就不必为我需要的每个值类型发出新的post请求

我知道我可以将这些值名硬编码到models.py和serializer.py中,但我需要保持models.py现在的状态

另外,下面是我试图发布的JSON示例:

{“节点ID”:“2”,“温度(C)”:“22.6”,“湿度(%)”:“29.67”,“Pyra(WPM)”:“118.9”,“系统时间”:“1592287220”}

这是我得到的答复:

{ “id”:80, “系统时间”:1592287220.0, “节点ID”:“2”, “温度(C)”:22.6, “单位”:空, “valueName”:空 }

型号.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)
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
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)
序列化程序.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)
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
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)
视图.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)
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
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)

如果我了解您的问题,您希望为每个
额外的\u kwargs
项保存一个
DataValueTable的实例,您可以执行以下操作:

def创建(自我验证的_数据):
对于键入self.extra_kwargs.keys():
数据\u值=已验证的\u数据.get(键)
如果数据值为:
DataValueTable.objects.create(valueName=key,value=data\u value,**已验证的数据)

对于其他难以发布多个值的人,请查看批量\u createDjango方法以发布多行数据:


Bulk_create并不是我最初想要做的,但它是我遇到的最好的解决方案。它还显著提高了发布速度,这是一个巨大的优势。

如果您需要在同一字段中存储各种值,有两种方法可以实现,即DB设计。一种是有一个字段可以支持值列表(
ArrayField
,我相信是Django),或者您可以将该字段抽象到它自己的表中,并将其与当前所在的表关联起来。在当前的设计中,表中需要有多个条目,每个条目都具有
字段的唯一信息,因为该字段每个条目只接受一个值。是!我想这就是我想要做的。我尝试了你的代码,它似乎没有改变任何东西,但它看起来就像我要做的。我可能只需要玩玩它。额外的_kwargs仅在meta类中定义,因此我必须将def create也放在meta类中。你认为这就是它没有改变任何东西的原因吗?是的,你需要把
create
方法放在元类之外,你需要找到一种方法来获得
extra\u kwargs
插入
create
方法