如何在Django REST中序列化层次关系

use*_*887 7 python django serialization django-mptt django-rest-framework

我有一个Django模型,使用django-mptt分层,看起来像:

class UOMCategory(MPTTModel, BaseModel):
    """
        This represents categories of different unit of measurements.
    """
    name = models.CharField(max_length=50, unique=True)
    description = models.CharField(max_length=50, unique=True)
    parent = TreeForeignKey('self', null=True, blank=True, related_name='%(app_label)s_%(class)s_sub_uom_categories')
Run Code Online (Sandbox Code Playgroud)

现在的问题是我使用Django REST Framework创建了一个REST API; 如何确保父字段返回序列化数据?

这是Model Serializer:

class UOMCategorySerializer(BaseModelSerializer):
    """
    REST API Serializer for UOMCategory model
    """
    class Meta:
        model = UOMCategory
Run Code Online (Sandbox Code Playgroud)

jjk*_*ter 8

在DRF中,您可以将序列化程序用作另一个序列化程序中的字段.但是,递归是不可能的.

汤姆克里斯蒂在另一个问题上发布了一个解决方案(Django rest框架嵌套的自引用对象).他的解决方案也适用于您的问题.

在您的UOMCategorySerializer.Meta类中,指定要使用的字段,还列出其中的父字段和/或子字段.然后你使用Tom Christies解决方案.

在你的情况下,这将给出:

class UOMCategorySerializer(ModelSerializer):
    class Meta:
        model = UOMCategory
        fields = ('name', 'description', 'parent', 'children')
Run Code Online (Sandbox Code Playgroud)

Tom Christies解决方案:通过指定父母和/或孩子使用哪个字段,您可以避免使用太多(可能是无限的)递归:

UOMCategorySerializer.base_fields['parent'] = UOMCategorySerializer()
UOMCategorySerializer.base_fields['children'] = UOMCategorySerializer(many=True)
Run Code Online (Sandbox Code Playgroud)

上述情况对我来说类似的情况.