提问人:Nacho Díaz Reyes 提问时间:6/18/2016 最后编辑:Aneesh R SNacho Díaz Reyes 更新时间:3/3/2023 访问量:3171
ProgrammingError:列“X”的类型为双精度,但表达式的类型为 numeric[]
ProgrammingError: column "X" is of type double precision but expression is of type numeric[]
问:
我正在尝试使用 Django Rest 框架和 Psycopg2 库编写 API。此 API 适用于 PostgreSQL 数据库。我需要在此数据库中存储 2 个浮点数组字段,因为 API 与 2 个传感器一起工作,这些传感器将数据流式传输到 Android 应用程序,并且它们以两个数组的形式存储在应用程序中,并通过 JSON 发送到 API REST。
这些是我的 models.py、serializers.py 和views_api.py:
Models.py
class DataTest(models.Model):
patient = models.ForeignKey(Patient)
label = models.CharField(max_length=36)
angle_data = ArrayField(models.FloatField())
emg_data = ArrayField(models.FloatField())
created_at = models.DateTimeField(auto_now_add=True)
modified_at = models.DateTimeField(auto_now=True)
def __unicode__(self):
return self.patient
Serializers.py
class DataTestSerializer(serializers.Serializer):
pk = serializers.IntegerField(read_only=True)
label = serializers.CharField()
angle_data = serializers.ListField(child=serializers.FloatField())
emg_data = serializers.ListField(child=serializers.FloatField())
patient = serializers.PrimaryKeyRelatedField(queryset=Patient.objects.all())
def create(self, validated_data):
return DataTest.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.label = validated_data.get('label', instance.label)
instance.angle_data = validated_data.get('angle_data', instance.angle_data)
instance.emg_data = validated_data.get('emg_data', instance.emg_data)
instance.patient = validated_data.get('patient', instance.patient)
instance.save()
return instance
api.py
class DataTestList(APIView):
def get(self, request, format=None):
dataTests = DataTest.objects.all()
serializer = DataTestSerializer(dataTests, many=True)
return Response(serializer.data)
def post(self, request, format=None):
serializer = DataTestSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.error_messages,
status=status.HTTP_400_BAD_REQUEST)
最后,我测试了 API,并发送了一个 JSON 示例: { “label”:“测试”, “angle_data”:[1.434, 2.243, 3.234], “emg_data”:[2.3, 2.1], “患者”:1 }
我收到以下错误:
ProgrammingError:列“angle_data”的类型为双精度,但表达式的类型为 numeric[] 第 1 行: ..., “created_at”, “modified_at”) 值 (1, 'Test', ARRAY[1.0,... ^
提示:您将需要重写或强制转换表达式。
我已经调试了 API,并且看到序列化程序收到一个浮点列表。我想问题是PostgreSQL中的列是双精度的,而浮点列表没有用双精度编码。
谁能帮我?
问候,谢谢!!
答:
我发现这篇文章在处理 django 模型中的 JSON 数据时很有帮助
https://www.laurencegellert.com/2018/09/django-tricks-for-processing-and-storing-json/
此外,我还使用 https://github.com/django-json-api/django-rest-framework-json-api 来获得带有 DRF 的格式更好的超媒体 RESTful API。还 https://docs.djangoproject.com/en/dev/releases/4.2/#jsonfield-for-all-supported-database-backends
您也可以尝试带有 Child 参数的 ListField。
这更像是一个高层次的建议。
评论
psql
\d [tablename]
angle_data = serializers.ListField(child=serializers.FloatField())
1.434
angle_data
[1.434, 2.243, 3.234]
double precisions []
[1.434, 2.243, 3.234]
1.434 (without brackets)
serializer
modelSerializer
ListField