Django Serializer对象不是JSON Serializable

时间:2018-04-02 18:58:38

标签: python django serialization django-models django-rest-framework

所以我正在使用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模型使用值作为十进制字段,传感器作为外键,并指向另一个外键。我正在使用选择字段来获取已创建的对象,但是从create函数中,我得到一个TypeError,说明(传感器对象)不是JSON可序列化的。我认为同样的事情正在发生,但我不确定该怎么做。任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:0)

根据to选项有效值列表或(key,display_name)元组列表。从Sensor和MapPoint对象或元组(字段,display_name)指定字段:

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

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

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

答案 1 :(得分:0)

这里的主要问题是你传递DataPoint类是create function而不是DataPoint对象的结果。这就是错误的含义。此外,sensorpoint是主键。因此,您可以在PrimaryKeyRelatedField中使用serializer

试试这个

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)

注意:由于您使用的是模型序列化程序,因此无需为fieldscreate函数指定update或编写定义。模型序列化器本身从模型中查找字段,它应包含简单创建和更新函数的定义。您可以看到详细信息here。考虑到这些,您的DataPointSerializer可以最小化到

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