【问题标题】:Django Rest collecting multiple records into a listDjango Rest 将多条记录收集到一个列表中
【发布时间】:2015-11-06 13:36:38
【问题描述】:

我有一个餐厅应用程序,我正在使用序列化程序为其创建 api。我有一张餐厅桌子和一张电话号码表。电话号码表引用 restaurant_id 作为外键。同样,还有其他类似的关系。我写了一个这样的序列化器:

class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = PhoneNumberSerializer(many=True)

    class Meta:
        model = Restaurant
        fields = ('brand', 'address', 'id', 'numbers')

这给出的是一个嵌套结构。虽然在某些情况下在这里有用,但它变得没有必要,因为PhoneNumberSerializer 有一个字段。有没有办法将嵌套折叠成单个字段以获得更简单的 json?

从这里:

{
    "restaurant_name": "Blah Blah:
     ...

    "numbers": {
                 {
                  "number": 123
                },{
                  "number": 456
                  }
                }
}

收件人:

{
"restaurant_name": "Blah Blah:
...
"numbers": ["123", "456"]

}

【问题讨论】:

  • 不应该numbers 是一个字典列表吗?

标签: json django api django-rest-framework serialization


【解决方案1】:

看起来您已经编写了自己的序列化程序,在这种情况下您不需要。您可以使用 StringRelatedField(many=True)。

from rest_framework import serializers 
class RestaurantOrderSerializer(serializers.ModelSerializer):
    brand = BrandSerializer()
    numbers = serializers.StringRelatedField(many=True)

【讨论】:

    【解决方案2】:

    您可以重写to_representation() 方法来实现这一点。

    如果您需要更改序列化、反序列化或验证 的序列化程序类,您可以通过覆盖 .to_representation().to_internal_value() 方法。

    您需要执行以下操作:

    class RestaurantOrderSerializer(serializers.ModelSerializer):
        brand = BrandSerializer()
        numbers = PhoneNumberSerializer(many=True)
    
        class Meta:
            model = Restaurant
            fields = ('brand', 'address', 'id', 'numbers')
    
        def to_representation(self, obj):
            # get the default representation
            serialized_data = super(RestaurantOrderSerializer, self).to_representation(obj)
            numbers = serialized_data['numbers'] 
            serialized_data['numbers'] = [x['number'] for x in numbers] # list of numbers
            return serialized_data
    

    【讨论】:

      猜你喜欢
      • 2012-06-06
      • 2012-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多