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