Django:使用相同模型的父级和子级创建JSONResponse [英] Django: Create a JSONResponse with parent and children from the same model
本文介绍了Django:使用相同模型的父级和子级创建JSONResponse的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有类别模型,该模型具有一个归因于其的父字段:
I have Category model that has a parent field attributed to itself:
class Category(models.Model):
name = models.CharField(max_length = 50, blank = True)
parent = models.ForeignKey('self', null = True, blank = True, on_delete = models.CASCADE)
class Meta:
verbose_name = 'Category'
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
我想使用DRF发送具有以下内容的api响应:
I want to send an api response using DRF with something similar to this:
items: [
{
id: 1,
name: 'Applications ',
children: [
{ id: 2, name: 'Calendar : app' },
{ id: 3, name: 'Chrome : app' },
{ id: 4, name: 'Webstorm : app' },
],
},
{
id: 5,
name: 'Documents',
children: [
{
id: 6,
name: 'vuetify',
children: [
{
id: 7,
name: 'src ',
children: [
{ id: 8, name: 'index : ts' },
{ id: 9, name: 'bootstrap : ts' },
],
},
],
},
{
id: 10,
name: 'material2',
children: [
{
id: 11,
name: 'src ',
children: [
{ id: 12, name: 'v-btn : ts' },
{ id: 13, name: 'v-card : ts' },
{ id: 14, name: 'v-window : ts' },
],
},
],
},
],
},
],
在此处有一个使用递归的答案,但这是针对单亲的.我怎样才能更好地实现它?
There is an answer here using recursion, but it is for a single parent. How can I achieve it in a better way?
推荐答案
要最小化数据库查询,您需要对模型进行现代化
To minimize database queries you need to modernize your model
- 安装django-mptt
- 更改型号
# models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
class Category(MPTTModel):
name = models.CharField(max_length = 50, blank = True)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['name']
class Meta:
verbose_name = 'Category'
verbose_name_plural = 'Categories'
def __str__(self):
return self.name
- 创建序列化器
# serializers.py
class CategoryTreeSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
fields = ['id', 'name', 'children']
def get_children(self, obj):
serializer = self.__class__(obj.get_children(), many=True, context=self.context)
return serializer.data
- 创建视图集
# view.py
from rest_framework import generics
from rest_framework.response import Response
from .models import Category
from .serializers import CategoryTreeSerializer
class CategoryListAPIView(generics.GenericAPIView):
queryset = Category.objects.all()
serializer_class = CategoryTreeSerializer
def list(self, request, *args, **kwargs):
qs = self.get_queryset().get_descendants(include_self=True).get_cached_trees()
serializer = self.get_serializer(qs, many=True)
return Response(serializer.data)
这篇关于Django:使用相同模型的父级和子级创建JSONResponse的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文