[PYTHON] Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework

Objectif de cet article

Prenons le cas d'un modèle avec une relation récursive (comme une arborescence). Créez une API qui renvoie de manière récursive json à l'aide de Django REST Framework.

environnement

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

Model

Définit un modèle avec une relation récursive. Considérez un modèle qui a plus de sous-catégories dans la catégorie. Le nom de la relation inverse est sous-catégories.

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 Définissez un SubCategorySerializer qui hérite du ModelSerializer et écrasez les sous-catégories, qui sont les relations inverses de la Category, avec le SubCategorySerializer. À ce stade, parentCategory doit renvoyer serializers.PrimaryKeyRelatedField ().

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

C'est OK si vous spécifiez CategorySerializer pour Serializer dans View. L'ensemble de requêtes doit être une requête capable de récupérer de manière unique la hiérarchie supérieure. Si vous utilisez get (), vous obtiendrez l'objet, utilisez donc filter () qui renvoie une requête. (Par exemple, définissez is_root dans le modèle et obtenez-le avec filter (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

Autrement

Il peut également être réalisé en définissant et en renvoyant le champ récursif suivant. Je pense que c'est également bon car il est flexible.

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

résultat

C'est un modèle différent de l'exemple ci-dessus, mais s'il s'agit d'un modèle de système de fichiers avec une structure arborescente simple et des relations récursives, ce json sera retourné.

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": []
                    }
                ]
            }
        ]
    }
]

Amusons-nous tous avec Django et créons une API REST! !!

référence

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

Je souhaite créer une API qui retourne un modèle avec une relation récursive dans Django REST Framework
Créer une API REST pour faire fonctionner dynamodb avec le Framework Django REST
Création d'une API qui renvoie des résultats d'inférence négatifs-positifs à l'aide de BERT dans le framework Django REST
Comment créer une API Rest dans Django
Essayez de créer une application Todo avec le framework Django REST
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
Créer une API qui renvoie les données d'un modèle à l'aide de turicreate
Créer une API REST qui renvoie l'heure actuelle avec Python3 + Falcon
Je veux créer un graphique avec des lignes ondulées au milieu avec matplotlib (je veux manipuler l'impression)
Je souhaite créer facilement un modèle de bruit
Je veux créer une fenêtre avec Python
Je souhaite créer une file d'attente prioritaire pouvant être mise à jour avec Python (2.7)
Créez une API REST à l'aide du modèle appris dans Lobe et TensorFlow Serving.
Créez un filtre pour obtenir un jeton d'accès avec l'API Graph (Flask)
J'ai essayé de créer un modèle avec l'exemple d'Amazon SageMaker Autopilot
Créer une application Todo avec Django REST Framework + Angular
Je veux faire la transition avec un bouton sur le ballon
Lorsque vous souhaitez filtrer avec le framework Django REST
Je veux travailler avec un robot en python.
Je souhaite créer manuellement une légende avec matplotlib
Développer une API Web qui renvoie les données stockées dans DB avec Django et SQLite
Je souhaite créer une base de données de déjeuners [EP1] Django pour la première fois
Je souhaite créer une base de données de déjeuner [EP1-4] Django pour la première fois
Je souhaite envoyer un message d'erreur en japonais avec le formulaire de changement de mot de passe django
Créer une API avec Django
Comment écrire une validation personnalisée dans Django REST Framework
La première API à créer avec le framework Python Djnago REST
Je veux créer un éditeur de blog avec l'administrateur de django
Je n'arrive pas à me connecter à la page d'administration avec Django 3
Tornado - Créons une API Web qui renvoie facilement JSON avec JSON
Créez une API Web capable de fournir des images avec Django
Je veux créer un Dockerfile pour le moment.
J'ai essayé de créer un article dans Wiki.js avec SQL Alchemy
J'ai essayé de créer une API RESTful en connectant l'API rapide du framework Python explosif à MySQL.
Un script qui facilite la création de menus riches avec l'API de messagerie LINE
Comment créer un enregistrement en collant une relation au modèle source d'héritage dans le modèle hérité par Django
Une histoire qui rend le débogage de modèle plus facile à voir dans l'environnement Django + SQLAlchemy
Une histoire dont je voulais afficher le résultat de la division (%) sur HTML avec une application utilisant django [Débutant apprend python avec un livre de référence dans une main]
Je souhaite utiliser un caractère générique que je souhaite décortiquer avec Python remove
Créez un alias pour Route53 vers CloudFront avec l'API AWS
[Python / Django] Créer une API Web qui répond au format JSON
Qiskit: Je veux créer un circuit qui crée des états arbitraires! !!
Je veux créer un système pour éviter d'oublier de serrer la clé 1
Je veux créer un fichier pip et le refléter dans le menu fixe
Essayez de créer un article de Qiita avec l'API REST [Préparation environnementale]
Créez une application qui recherche uniquement à l'aide de l'API de recherche personnalisée Google avec Python 3.3.1 dans Bottle
[Django] Que faire quand il y a de nombreux champs dans le modèle que vous souhaitez créer
J'ai trouvé un moyen de créer un modèle 3D à partir de photos Partie 01 Créer un environnement
Une histoire qui n'a pas fonctionné lorsque j'ai essayé de me connecter avec le module de requêtes Python
Une histoire que j'ai eu du mal en essayant de créer une "application qui convertit des images comme des peintures" avec la première application Web
Je souhaite améliorer l'efficacité avec Python même dans le système expérimental (5) Je souhaite envoyer une notification à la fin de l'expérience avec l'API slack
Implémentation de la fonction d'authentification du modèle utilisateur personnalisé dans Django REST Framework à l'aide de djoser
Notez que vous souhaitez décorer manuellement les paramètres passés dans le formulaire du modèle Django élément par élément
Créer une API RESTful avec Django Rest Framework
J'ai créé un script POST pour créer un problème sur Github et l'enregistrer dans le projet
Si vous voulez être guéri par l'image de Mia Nanasawa, appuyez sur l'API Twitter ♪
Je veux imprimer dans la notation d'inclusion
[Pour les débutants] Je veux obtenir l'index d'un élément qui satisfait une certaine expression conditionnelle
(Matplotlib) Je veux dessiner un graphique avec une taille spécifiée en pixels