[PYTHON] Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt

Ziel dieses Artikels

Betrachten Sie den Fall eines Modells mit einer rekursiven Beziehung (z. B. einer Baumstruktur). Erstellen Sie mit dem Django REST Framework eine API, die json rekursiv zurückgibt.

Umgebung

MacOS(10.11.6 / ElCapitane) Python 3.5.2 Django 1.10.4 DjangoRESTFramework 3.5.3

Model

Definiert ein Modell mit einer rekursiven Beziehung. Stellen Sie sich ein Modell vor, das mehr Unterkategorien innerhalb der Kategorie enthält. Der Name der umgekehrten Beziehung lautet Unterkategorien.

models.py


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 Definieren Sie einen SubCategorySerializer, der den ModelSerializer erbt, und überschreiben Sie die Unterkategorien, die die umgekehrten Beziehungen der Kategorie darstellen, mit dem SubCategorySerializer. Zu diesem Zeitpunkt sollte parentCategory serializers.PrimaryKeyRelatedField () zurückgeben.

serializers.py


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

View

Es ist in Ordnung, wenn Sie CategorySerializer für Serializer in View angeben. Der Abfragesatz sollte eine Abfrage sein, mit der die oberste Hierarchie eindeutig abgerufen werden kann. Wenn Sie get () verwenden, erhalten Sie das Objekt. Verwenden Sie daher filter (), das eine Abfrage zurückgibt. (Definieren Sie beispielsweise is_root im Modell und rufen Sie es mit filter ab (is_root = True).)

view.py


class CategoryListViewSet(viewsets.ModelViewSet):
    queryset = Category.objects.filter(id='e.g...root_category_id').prefetch_related('subcategories__subcategories')
    serializer_class = CategorySeriarizer

Ein anderer Weg

Dies kann auch durch Definieren und Zurückgeben des folgenden rekursiven Felds realisiert werden. Ich finde das auch gut, weil es flexibel ist.

serializers.py


class RecursiveField(serializers.Serializer):
    def to_representation(self, value):
        serializer = self.parent.parent.__class__(value, context=self.context)
        return serializer.data

class CategorySerializer(serializers.Serializer):
    subcategories = RecursiveField(many=True)

    class Meta:
        model = Comment
        fields = ('parendCategory','name', 'description', 'subcategories')

Ergebnis

Es ist ein anderes Modell als im obigen Beispiel, aber wenn es sich um ein Dateisystemmodell mit einer einfachen Baumstruktur und rekursiven Beziehungen handelt, wird dieser JSON zurückgegeben.

hoge.json


[
    {
        "name": "RootDirectory",
        "is_root": true,
        "is_dir": true,
        "parent_file": null,
        "child_files": [
            {
                "name": "root_file",
                "is_root": false,
                "is_dir": false,
                "parent_file": 34,
                "child_files": []
            },
            {
                "name": "TestDir",
                "is_root": false,
                "is_dir": true,
                "parent_file": 34,
                "child_files": [
                    {
                        "name": "test.zip",
                        "is_root": false,
                        "is_dir": false,
                        "parent_file": 35,
                        "child_files": []
                    },
                    {
                        "name": "test_dir_file.png ",
                        "is_root": false,
                        "is_dir": false,
                        "parent_file": 35,
                        "child_files": []
                    }
                ]
            }
        ]
    }
]

Lasst uns alle Spaß mit Django haben und eine REST-API erstellen! !!

Referenz

http://www.django-rest-framework.org/api-guide/relations/#custom-relational-fields http://stackoverflow.com/questions/13376894/django-rest-framework-nested-self-referential-objects

Recommended Posts

Ich möchte eine API erstellen, die ein Modell mit einer rekursiven Beziehung im Django REST Framework zurückgibt
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen einer API, die mit BERT im Django REST-Framework negativ-positive Inferenzergebnisse zurückgibt
So erstellen Sie eine Rest-API in Django
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Erstellen Sie mit turicreate eine API, die Daten aus einem Modell zurückgibt
Erstellen Sie mit Python3 + Falcon eine REST-API, die die aktuelle Uhrzeit zurückgibt
Ich möchte mit matplotlib ein Diagramm mit Wellenlinien in der Mitte erstellen (ich möchte den Eindruck manipulieren).
Ich möchte einfach ein Rauschmodell erstellen
Ich möchte mit Python ein Fenster erstellen
Ich möchte eine Prioritätswarteschlange erstellen, die mit Python (2.7) aktualisiert werden kann.
Erstellen Sie eine REST-API mit dem in Lobe und TensorFlow Serving erlernten Modell.
Erstellen Sie einen Filter, um ein Zugriffstoken mit der Graph-API (Flask) zu erhalten.
Ich habe versucht, ein Modell mit dem Beispiel von Amazon SageMaker Autopilot zu erstellen
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Ich möchte mit einem Knopf am Kolben übergehen
Wenn Sie mit dem Django REST-Framework filtern möchten
Ich möchte mit einem Roboter in Python arbeiten.
Ich möchte manuell eine Legende mit matplotlib erstellen
Entwickeln Sie eine Web-API, die in DB gespeicherte Daten mit Django und SQLite zurückgibt
Ich möchte zum ersten Mal eine Django-Studie zur Mittagsdatenbank [EP1] erstellen
Ich möchte zum ersten Mal eine Django-Studie zum Mittagessen [EP1-4] erstellen
Ich möchte eine Fehlermeldung auf Japanisch mit dem Django-Passwortänderungsformular ausgeben
Erstellen Sie eine API mit Django
So schreiben Sie eine benutzerdefinierte Validierung in Django REST Framework
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Ich möchte einen Blog-Editor mit dem Administrator von Django erstellen
Ich kann mich mit Django 3 nicht auf der Admin-Seite anmelden
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
Ich möchte vorerst eine Docker-Datei erstellen.
Ich habe versucht, einen Artikel mit SQL Alchemy auf Wiki.js zu erstellen
Ich habe versucht, eine RESTful-API zu erstellen, indem ich die explosive Fast-API des Python-Frameworks mit MySQL verbunden habe.
Ein Skript, mit dem Sie mit der LINE Messaging-API auf einfache Weise umfangreiche Menüs erstellen können
So erstellen Sie einen Datensatz, indem Sie eine Beziehung zum geerbten Modell in das von Django geerbte Modell einfügen
Eine Geschichte, die das Debuggen von Modellen in der Django + SQLAlchemy-Umgebung einfacher macht
Eine Geschichte, bei der ich das Teilungsergebnis (%) in HTML mit einer Anwendung mit Django anzeigen wollte [Anfänger lernt Python mit einem Nachschlagewerk in einer Hand]
Ich möchte einen Platzhalter verwenden, den ich mit Python entfernen möchte
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Qiskit: Ich möchte eine Schaltung erstellen, die beliebige Zustände erzeugt! !!
Ich möchte ein System erstellen, um zu verhindern, dass vergessen wird, den Schlüssel 1 festzuziehen
Ich möchte eine Pipfile erstellen und im Docker wiedergeben
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
Erstellen Sie eine Anwendung, die nur mit der Google Custom Search-API mit Python 3.3.1 in Bottle sucht
[Django] Was tun, wenn das zu erstellende Modell viele Felder enthält?
Ich habe mir eine Möglichkeit ausgedacht, ein 3D-Modell aus Fotos zu erstellen. Teil 01 Erstellen einer Umgebung
Eine Geschichte, die nicht funktioniert hat, als ich versucht habe, mich mit dem Python-Anforderungsmodul anzumelden
Eine Geschichte, bei der es mir schwer gefallen ist, mit der ersten Webanwendung eine "App zu erstellen, die Bilder wie Gemälde konvertiert"
Ich möchte die Effizienz mit Python auch im experimentellen System verbessern. (5) Ich möchte am Ende des Experiments eine Benachrichtigung mit der Slack-API senden
Implementierung der benutzerdefinierten Authentifizierungsfunktion für Benutzermodelle in Django REST Framework mit djoser
Beachten Sie, dass Sie die im Django-Vorlagenformular übergebenen Parameter Element für Element manuell dekorieren möchten
Erstellen Sie eine RESTful-API mit dem Django Rest Framework
Ich habe ein POST-Skript erstellt, um ein Problem in Github zu erstellen und es im Projekt zu registrieren
Wenn Sie von Mia Nanasawas Bild geheilt werden möchten, klicken Sie auf die Twitter-API ♪
Ich möchte in der Einschlussnotation drucken
[Für Anfänger] Ich möchte den Index eines Elements erhalten, das einen bestimmten bedingten Ausdruck erfüllt
(Matplotlib) Ich möchte ein Diagramm mit einer in Pixel angegebenen Größe zeichnen