首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询结果的自定义JSON表示

问查询结果的自定义JSON表示
EN

Stack Overflow用户
提问于 2015-12-10 19:50:55
回答 3查看 226关注 0票数 1

我正在寻找Django REST框架中的位置,以便在想要以特定方式格式化查询结果时挂钩。

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

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

EN

回答 3

Stack Overflow用户

发布于 2015-12-10 20:21:33

我希望这能帮到你。(Django 1.8)

型号:

代码语言:javascript
复制
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)

序列化程序:

代码语言:javascript
复制
    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,您可以为您的记录添加任何自定义值。您可以使用此方法修改序列化程序。

票数 3
EN

Stack Overflow用户

发布于 2015-12-10 23:54:13

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

代码语言:javascript
复制
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在列表中就行了。

票数 2
EN

Stack Overflow用户

发布于 2015-12-10 20:14:26

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

代码语言:javascript
复制
class ModelASerializer(serializers.ModelSerilizer):
      modelb = ModelBSerializer(many=True) # case many to many realtionship

订单

代码语言:javascript
复制
      modelb = ModelBSerializer(read_only=True) # case foreign key

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

检查Model Serializer、Field Serializer

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34201168

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档