drf 实现多级菜单的完整例子
时间: 2023-12-20 11:05:33 浏览: 145
下面是一个 DRF 实现多级菜单的完整例子,展示了如何使用 Serializer 嵌套和 ModelViewSet 来实现多级菜单的 API:
models.py:
```python
from django.db import models
class Menu(models.Model):
name = models.CharField(max_length=50)
parent = models.ForeignKey('self', blank=True, null=True, related_name='children', on_delete=models.CASCADE)
def __str__(self):
return self.name
```
serializers.py:
```python
from rest_framework import serializers
from .models import Menu
class MenuSerializer(serializers.ModelSerializer):
children = serializers.SerializerMethodField()
class Meta:
model = Menu
fields = ('id', 'name', 'parent', 'children')
def get_children(self, obj):
serializer = self.__class__(obj.children.all(), many=True)
return serializer.data
```
views.py:
```python
from rest_framework import viewsets
from .models import Menu
from .serializers import MenuSerializer
class MenuViewSet(viewsets.ModelViewSet):
queryset = Menu.objects.filter(parent=None)
serializer_class = MenuSerializer
def get_queryset(self):
parent_id = self.request.query_params.get('parent')
if parent_id:
return Menu.objects.filter(parent=parent_id)
return super().get_queryset()
```
在上面的例子中,Menu 表示菜单模型,其中包含了菜单的名称和父菜单。在 MenuSerializer 中,使用 SerializerMethodField 来表示子菜单,通过递归嵌套 MenuSerializer,就能够实现多级菜单的序列化。在 MenuViewSet 中,重写了 get_queryset 方法来实现根据父菜单查询子菜单的功能。通过访问 /menus/ 可以获取所有的一级菜单,访问 /menus/?parent=id 可以获取指定父菜单的子菜单。
阅读全文