【问题标题】:Adding Many Serializer to A Nested Serializer Field向嵌套的序列化器字段添加许多序列化器
【发布时间】:2016-10-04 10:39:31
【问题描述】:

serializers.py

class BusOncomingSerializer(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    stops_left = serializers.IntegerField(read_only=True)


class StopOncomingSerialier(serializers.Serializer):
    idn = serializers.IntegerField(read_only=True)
    buses = BusOncomingSerializer(many=True)

我的序列化程序实例在以下列表中有效:

buses_serializers = [bus1, bus2, bus3]
# busX means instance of BusOncomingSerializer and they are valid.

我正在尝试通过以下方式将这些 BusOncomingSerializer 实例添加到单个 StopOncomingSerializer 实例中:

serializer = serializers.StopOncomingSerializers(data={"idn": 1, "buses": buses_serializers})

我运行is_valid()。但是,它提出了:

TypeError: BusOncomingSerializer(data={'idn': 285, 'stops_left': 7}): idn = IntegerField(read_only=True)stops_left = IntegerField(read_only=True) 不是 JSON可序列化

我不应该用列表添加我的序列化程序实例吗,还有其他方法吗?


环境

  • python 3.5.1
  • django 1.9.5
  • django-rest-framework 3.3.3

【问题讨论】:

    标签: python django python-3.x django-rest-framework


    【解决方案1】:

    您将数据错误地传递给StopOncomingSerializer。您应该将值作为字典列表传递,而不是传递 bus 实例。

    示例数据格式:

    {
        'idn': 7, 
        'buses': [
            {'idn':3, 'stops_left': 3}, 
            {'idn': 4, 'stops_left':6}
        ]
    }
    

    在 Python Shell 上:

    In [5]: data = {'idn': 7, 'buses': [{'idn':3, 'stops_left': 3}, {'idn': 4, 'stops_left':6}]}
    
    In [6]: s1 = StopOncomingSerialier(data=data)
    
    In [7]: s1.is_valid()
    Out[7]: True
    

    【讨论】:

    • 我将StopOncomingSerializer 实例初始化为serializer = serializers.StopOncomingSerialier(data={"idn": stop_idn, "buses": buses})。你能在此基础上举一个例子吗? |注意:buses 是一个包含许多 BusOncomingSerializer 实例的列表。
    • 我添加了一个在 shell 上完成的示例。也许这应该有所帮助。
    • @ErdinEray 传递整个结构,之前不要尝试解析总线,让序列化器完成它的工作并解析所有深层结构
    猜你喜欢
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    • 2015-03-07
    • 2023-03-17
    相关资源
    最近更新 更多