我有一个模型,看起来是这样的:

class Category(models.Model):
    parentCategory = models.ForeignKey('self', blank=True, null=True, related_name='subcategories')
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=500)

我设法用serializer获得了所有类别的平面json表示:

class CategorySerializer(serializers.HyperlinkedModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.ManyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

现在我要做的是使子类别列表具有子类别的内联json表示,而不是它们的ID.我如何使用Django -睡觉-框架做到这一点?我试着在文档中找到它,但它似乎不完整.

推荐答案

不使用ManyRelatedField,而是使用嵌套的序列化程序作为字段:

class SubCategorySerializer(serializers.ModelSerializer):
    class Meta:
        model = Category
        fields = ('name', 'description')

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()
    subcategories = serializers.SubCategorySerializer()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

如果你想处理任意嵌套的字段,你应该看看文档的customising the default fields部分.当前不能直接将序列化程序声明为其自身的字段,但可以使用这些方法覆盖默认情况下使用的字段.

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

        def get_related_field(self, model_field):
            # Handles initializing the `subcategories` field
            return CategorySerializer()

实际上,正如您已经注意到的那样,上面的说法并不完全正确. 这有点麻烦,但是您可以try 在已经声明了序列化程序之后添加该字段.

class CategorySerializer(serializers.ModelSerializer):
    parentCategory = serializers.PrimaryKeyRelatedField()

    class Meta:
        model = Category
        fields = ('parentCategory', 'name', 'description', 'subcategories')

CategorySerializer.base_fields['subcategories'] = CategorySerializer()

需要添加声明递归关系的机制.


Edit:请注意,现在有专门处理这类用例的第三方包可用.请参见djangorestframework-recursive.

Django相关问答推荐

在Django中使用Generil.ListView类时,分页不起作用

如何保护单个数据库行/模型实例?

Django多对多关系报错:<title> object (None)>需要先设置id字段的值.

源自访问外键关系的模型方法 get_absolute_url 的 django 重复 SQL 查询

如何在 Fargate 容器中运行的 Django 中使用 AWS SES?

Django 获取用户创建的对象,这些用户属于用户列表

包含资源时,DRF 返回我的软删除记录

Django Rest Framework 中的 to_representation() 可以访问普通字段吗

Django:无法从另一个应用程序导入模型

恢复 Django 1.7 RemoveField 迁移

Django 从 url 保存图像并与 ImageField 连接

如何将 Django forms.ChoiceField 呈现为 Twitter Bootstrap 下拉菜单

如何在 twitter-bootstrap 模式窗口中插入 django 表单?

Django:如何使用动态(非模型)数据预填充 FormView?

django:TypeError:'tuple'对象不可调用

Python 社区里的小马是怎么回事?

在 Django shell 启动时自动导入模型

如何过滤(或替换)在 UTF-8 中占用超过 3 个字节的 unicode 字符?

Heroku & Django:OSError: No such file or directory:'/app/{myappname}/static'

Django Debug Toolbar:了解时间面板( time panel)