Python 在django rest框架中向单个字段发布多个值?
我正在使用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”:空 } 型号.pyPython 在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请求 我知
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
方法