查询结果的自定义JSON表示

时间:2015-12-10 11:50:55

标签: django serialization django-rest-framework

我想在Django REST Framework中找到想要以特定方式格式化查询结果的地方。

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

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

3 个答案:

答案 0 :(得分:2)

我希望这会有所帮助......(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,您可以为记录添加任何自定义值。您可以使用此方法修改序列化程序。

答案 1 :(得分:2)

执行此操作的一种方法是覆盖to_representation中的serializers.ListSerializer方法。

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
to_representation中的

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

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

答案 2 :(得分:1)

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

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