【问题标题】:Django Serializer Object is not JSON SerializableDjango 序列化器对象不是 JSON 可序列化的
【发布时间】:2018-09-12 00:21:39
【问题描述】:

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

【问题讨论】:

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


【解决方案1】:

这里的主要问题是您将 DataPoint 类作为创建函数的结果而不是 DataPoint 对象传递。这就是错误的意思。而且sensorpoint 也是主键。所以你可以在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 函数编写定义。模型序列化器本身从模型中查找字段,它应该包含简单创建和更新函数的定义。您可以查看详情here。考虑到这些,您的 DataPointSerializer 可以最小化为

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

【讨论】:

    【解决方案2】:

    According to choices有效值列表,或 (key, display_name) 元组列表。指定 Sensor 和 MapPoint 对象或元组中的字段(字段、显示名称):

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-05-23
      • 2015-02-24
      • 2014-10-23
      • 2016-04-01
      • 2014-09-21
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多