【发布时间】:2020-11-04 13:45:28
【问题描述】:
所以我知道我的问题写得很糟糕,但我不确定最好的表达方式。让我解释一下。
我正在尝试让我的序列化程序类处理特定字段的多个值类型。例如,我需要将名为“Temp (C)”、“Humidity(%)”等的项目的 JSON 值都发布在我的序列化程序类中名为“value”的特定字段下。当然,我在 models.py 中也有一个名为“value”的模型。
这是我目前所拥有的:
models.py
class DataValueTable(models.Model):
timestamp = models.FloatField()
sensorName = models.TextField(null=True)
value = models.FloatField()
views.py
class DataValueTableList(APIView):
parser_classes = [JSONParser]
authentication_classes = []
permission_classes = []
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)
serializer.py
class DataValueTableSerializer(serializers.ModelSerializer):
class Meta:
model = DataValueTable
fields = ['id', 'System Time', 'Node ID', 'Temp (C)', 'Humidity(%)', 'Pyra (WPM)',]
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)
对于 serializer.py: 我作为 JSON 发布的值与 models.py 中的模型名称不同,因此我使用“extra_kwargs”将 JSON 名称映射到模型。
这是我要发布的内容:
{
"Node ID": "2",
"Temp (C)": "22.6",
"Humidity(%)": "29.67",
"Pyra (WPM)": "118.9",
"System Time": "1592287220"
}
回复如下:
{
"id": 126,
"System Time": 1592287220.0,
"Node ID": "2",
"Temp (C)": 2.69,
"Humidity(%)": 2.69,
"Pyra (WPM)": 2.69,
}
我能够将所有这些 JSON 项目发布到 Post,但每个项目的值都相同,这并不好。我知道出了什么问题,“def create”方法中的“validated_data”只跟踪数据,直到“value”的第一个实例,然后它停止。在这种情况下,它会遍历我的 DataValueTableSerializer 类中的“字段”列表,并在“Temp (C)”处停止,因为这是“值”的第一个实例。
所以这是我的问题: 有没有办法在 DataValueTableSerializer 类的“def create”方法中截断这个被发布的 JSON 数据之前访问它?我希望如果我可以访问数据,我可能会手动映射我需要的值,类似于我在“extra_kwargs”中所做的那样。或者,如果有人知道比我尝试做的更好的方法,那就太棒了!
【问题讨论】:
标签: python json django django-rest-framework serialization