【问题标题】:Custom JSON representation of query result查询结果的自定义 JSON 表示
【发布时间】:2016-03-16 01:06:05
【问题描述】:

当我想以特定方式格式化查询结果时,我正在寻找 Django REST Framework 中的位置。

也就是说,我想获取查询返回的所有行,并使用一些元数据和不同的(嵌套)结构创建非常特定类型的 JSON 响应。

似乎序列化程序一次只处理一行。自定义视图是否适合这样做?

【问题讨论】:

    标签: django serialization django-rest-framework


    【解决方案1】:

    我希望这会有所帮助...(Django 1.8)

    型号:

    class Users(AbstractBaseUser):
        email = models.EmailField(unique=True)
        username = models.CharField(max_length=100, blank=True)
        first_name = models.CharField(max_length=100, blank=True)
        last_name = models.CharField(max_length=100, blank=True)
        company = models.ForeignKey(Company)
    

    序列化器:

        class UserListSerializer(serializers.ModelSerializer):
            company_name = serializers.SerializerMethodField()
            def get_company_name(self, obj):
                return obj.company.name
    
            class Meta:
                model = Users
                fields = ('id', 'email', 'username', 'first_name', 'last_name',
                         'company_name','company')
    

    使用 SerializerMethodField,您可以为记录添加任何自定义值。您可以使用此方法修改您的序列化程序。

    【讨论】:

      【解决方案2】:

      一种方法是覆盖serializers.ListSerializer 中的to_representation 方法。

      class CustomListSerializer(serializers.ListSerializer):
      
          def to_representation(self, instances):
              data = []
              for instance in instances:
                  field1 = instance.field1
                  field2 = instance.field2
                  data.append({'field1':field1,'field2':field2})
              return data
      
      class YourSerializer(serializers.ModelSerializer):
      
          class Meta:
              model = YourModel
              list_serializer_class = CustomListSerializer
      

      serializers.ListSerializer 中的to_representation 方法将对象实例列表转换为原始数据类型的字典列表。

      我刚刚向您展示了可以做什么的示例。您可以根据需要修改to_representation。只需确保您的 dictionaries 在列表中即可。

      【讨论】:

        【解决方案3】:

        据我所知,您不需要任何钩子,DRF 默认支持嵌套结果,您只需根据模型之间的关系以及您希望它的显示方式使用正确的序列化程序类。

        class ModelASerializer(serializers.ModelSerilizer):
              modelb = ModelBSerializer(many=True) # case many to many realtionship
        

        顺序

              modelb = ModelBSerializer(read_only=True) # case foreign key
        

        所以根据您的需要,您可以使用序列化程序格式化您的响应,还有用于字段序列化的 serializers.DictField、serializers.ListField。

        检查Model SerializerField Serializer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-10-24
          • 1970-01-01
          • 2018-11-01
          • 2016-04-07
          • 1970-01-01
          • 2017-10-15
          相关资源
          最近更新 更多