Django序列化对象无法被JSON序列化

3

我正在开发一个使用Django的网站,但在序列化方面遇到了问题。以下是代码:

class DataPointSerializer(serializers.ModelSerializer):
    value = serializers.DecimalField(max_digits=30, decimal_places=15)
    sensor = serializers.ChoiceField(choices=list(Sensor.objects.all()))
    point = serializers.ChoiceField(choices=list(MapPoint.objects.all()))

    class Meta:
        model = DataPoint
        fields = "__all__"

    def create(self, attrs, instance=None):
        return DataPoint(value=attrs['value'], sensor=attrs['sensor'], point=attrs['point'])

我的 DataPoint 模型使用值作为十进制字段,传感器作为外键,另一个点也作为外键。我使用选择字段来获取已创建的对象,但从创建函数中获取 TypeError,指出(Sensor 对象)不可 JSON 序列化。我认为对于 point 也是相同的情况,但我不确定该怎么做。希望能得到任何帮助!


1
首先,您需要显示实际的完整回溯。但是第二个问题是,为什么要使用ChoiceField而不是序列化器关系? - Daniel Roseman
如何使一个类可 JSON 序列化 - Gytree
2个回答

0

根据选择有效值列表或(键、显示名称)元组列表。可以指定来自Sensor和MapPoint对象的字段或元组(field, display_name):

list(Sensor.objects.values_list('id').all())

或者,例如(如果您的模型有 name 字段)

list(Sensor.objects.values_list('id', 'name').all())

0
这里的主要问题是您将DataPoint类作为create函数的结果传递,而不是DataPoint对象。这就是错误的含义。另外,sensor和point是主键。因此,您可以在serializer中使用PrimaryKeyRelatedField。

尝试这个

class DataPointSerializer(serializers.ModelSerializer):
    value = serializers.DecimalField(max_digits=30, decimal_places=15)
    sensor = serializers.PrimaryKeyRelatedField(queryset=Sensor.objects.all())
    point = serializers.PrimaryKeyRelatedField(queryset=MapPoint.objects.all())

    class Meta:
        model = DataPoint
        fields = "__all__"

    def create(self, validated_data, instance=None):
        return DataPoint.objects.create(**validated_data)

注意:由于您正在使用模型序列化器,因此无需指定fields或编写createupdate函数的定义。模型序列化器本身会从模型中查找字段,并且应该包含简单创建和更新函数的定义。您可以在这里查看详细信息。考虑到这些因素,您的DataPointSerializer可以被最小化为:

class DataPointSerializer(serializers.ModelSerializer):
    class Meta:
        model = DataPoint
        fields = "__all__"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接