7

У меня есть модель Django, которая является иерархическим с использованием Джанго-mptt, который выглядит следующим образом:Как сериализовать иерархические отношения в Django REST

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') 

Проблема теперь я создал REST API с использованием Django REST Framework; как я могу убедиться, что родительское поле возвращает сериализованные данные?

Вот модель Serializer:

class UOMCategorySerializer(BaseModelSerializer): 
    """ 
    REST API Serializer for UOMCategory model 
    """ 
    class Meta: 
     model = UOMCategory 
+0

Трудно ответить без дополнительной информации. Можете ли вы добавить код Serializer в свой вопрос? Также я предполагаю, что вы имеете в виду http://www.django-rest-framework.org/; это может быть более конкретным. – craigds

+0

Да, я использую Django REST Framework – user3186887

ответ

7

В ФПИ вы можете использовать сериалайзер как поле в другом сериализаторе. Однако рекурсия невозможна. (Django rest framework nested self-referential objects). Его решение также будет работать с вашей проблемой.

В вашем классе UOMCategorySerializer.Meta вы указываете поля, которые хотите использовать, также укажите родительские и/или дочерние поля. Затем вы используете решение Тома Кристиса.

В вашем случае это даст:

решения
class UOMCategorySerializer(ModelSerializer): 
    class Meta: 
     model = UOMCategory 
     fields = ('name', 'description', 'parent', 'children') 

Том Christies: Определив, какое поле использовать для родителей и/или детей, избегать использования слишком много (и possibily бесконечен) рекурсии:

UOMCategorySerializer.base_fields['parent'] = UOMCategorySerializer() 
UOMCategorySerializer.base_fields['children'] = UOMCategorySerializer(many=True) 

Вышеупомянутые работы для меня в аналогичной ситуации.

 Смежные вопросы

  • Нет связанных вопросов^_^