7

Ich habe ein Django-Modell serialisiert, die django-MPTT hierarchisch verwenden, das wie folgt aussieht:Wie hierarchische Beziehung in Django REST

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

Das Problem ist, ich ein REST-API mit Django REST-Framework erstellt; Wie stelle ich sicher, dass das übergeordnete Feld serialisierte Daten zurückgibt?

Hier ist das Modell Serializer:

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

Dies ist ohne weitere Informationen schwer zu beantworten. Können Sie den Serializer-Code zu Ihrer Frage hinzufügen? Ich nehme auch an, dass du dich auf http://www.django-rest-framework.org/ beziehst; Es könnte helfen, genauer zu sein. – craigds

+0

Ja, ich verwende Django REST Framework – user3186887

Antwort

7

In DRF Sie einen Serializer als ein Feld in einem anderen Serializer verwenden können. Rekursion ist jedoch nicht möglich.

Tom Christie veröffentlichte eine Lösung zu einer anderen Frage (Django rest framework nested self-referential objects). Seine Lösung wird auch mit Ihrem Problem funktionieren.

In Ihrer Klasse UOMCategorySerializer.Meta geben Sie die Felder an, die Sie verwenden möchten, und geben Sie dort auch die übergeordneten und/oder untergeordneten Felder an. Dann verwenden Sie Tom Christies Lösung.

In Ihrem Fall würde dies geben:

class UOMCategorySerializer(ModelSerializer): 
    class Meta: 
     model = UOMCategory 
     fields = ('name', 'description', 'parent', 'children') 

Tom Christies Lösung: Durch die Angabe, was Feld für Eltern und/oder Kinder, vermeiden Sie zu viel verwenden (und possibily endlos) Rekursion:

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

Das obige funktioniert für mich in einer ähnlichen Situation.