基于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,提问作者Денис Буйволов
相关产品推荐
相关产品推荐

