Django:使用相同模型的父级和子级创建JSONResponse [英] Django: Create a JSONResponse with parent and children from the same model

查看:46
本文介绍了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

# 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆