You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django REST Framework的文件存储项目:添加children字段需求

实现DRF文件存储API的children字段返回

1. 调整Model外键关联

先给Folder和File的外键添加related_name,方便后续查询当前文件夹下的子文件夹和文件:

# models.py
FILE='FILE'
FOLDER='FOLDER'
TYPE_CHOICES = [(FILE,"FILE"),(FOLDER,"FOLDER")]

class Folder(models.Model):
    id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    # 添加related_name,用于查询子文件夹
    parent_id = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='subfolders')
    type = models.CharField(max_length=255, choices=TYPE_CHOICES, editable=False, default='FOLDER')
    name = models.CharField(max_length=255)
    date = models.DateField(auto_now=True)

class File(models.Model):
    type = models.CharField(max_length=255, choices=TYPE_CHOICES, editable=False, default='FILE')
    id = models.UUIDField(primary_key=True, editable=False, default=uuid.uuid4)
    file = models.FileField(null=True, max_length=255)
    date = models.DateTimeField(auto_now=True)
    # 添加related_name,用于查询文件夹下的文件
    parentId = models.ForeignKey(Folder, on_delete=models.CASCADE, related_name='files')

    def __str__(self):
        return str(self.file.name)

2. 自定义序列化器实现children字段

创建serializers.py,通过SerializerMethodField动态生成children字段,合并子文件夹和文件数据:

from rest_framework import serializers
from .models import Folder, File

class FileSerializer(serializers.ModelSerializer):
    class Meta:
        model = File
        fields = ['id', 'type', 'file', 'date']

class FolderSerializer(serializers.ModelSerializer):
    children = serializers.SerializerMethodField()

    class Meta:
        model = Folder
        fields = ['id', 'type', 'name', 'date', 'parent_id', 'children']

    def get_children(self, obj):
        # 获取当前文件夹的子文件夹并序列化(递归包含子文件夹的children)
        subfolders_data = FolderSerializer(obj.subfolders.all(), many=True, context=self.context).data
        # 获取当前文件夹的文件并序列化
        files_data = FileSerializer(obj.files.all(), many=True).data
        # 合并两类数据作为children返回
        return subfolders_data + files_data

3. 在视图中使用序列化器

用ModelViewSet快速搭建API视图,返回带children字段的数据:

from rest_framework import viewsets
from .models import Folder
from .serializers import FolderSerializer

class FolderViewSet(viewsets.ModelViewSet):
    queryset = Folder.objects.all()
    serializer_class = FolderSerializer

这样,当请求文件夹列表或详情时,返回的响应中每个文件夹对象都会包含children字段,里面是该文件夹下所有子文件夹(递归嵌套)和文件的集合。

内容的提问来源于stack exchange,提问作者Денис Буйволов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:05:28