DRF多对多关系案例
models.py
from django.db import models
class UserModel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
class Meta:
db_table = "user_tb"
verbose_name = "用户"
verbose_name_plural = verbose_name
class RoleModel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
users = models.ManyToManyField(to=UserModel, related_name="roles", db_constraint=False, blank=True)
powers = models.ManyToManyField(to="PowerModel", related_name="roles", db_constraint=False, blank=True)
class Meta:
db_table = "role_tb"
verbose_name = "角色"
verbose_name_plural = verbose_name
class PowerModel(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=255)
class Meta:
db_table = "power_tb"
verbose_name = "权限"
verbose_name_plural = verbose_name
views.py
from .models import UserModel, RoleModel, PowerModel
from rest_framework import serializers, viewsets
# 序列化器
class UserSearializer(serializers.ModelSerializer):
roles = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = UserModel
fields = "__all__"
class RoleSearializer(serializers.ModelSerializer):
class Meta:
model = RoleModel
fields = "__all__"
class PowerSearializer(serializers.ModelSerializer):
roles = serializers.PrimaryKeyRelatedField(many=True, read_only=True)
class Meta:
model = PowerModel
fields = "__all__"
# 视图
class UserViewSet(viewsets.ModelViewSet):
queryset = UserModel.objects.all()
serializer_class = UserSearializer
class RoleViewSet(viewsets.ModelViewSet):
queryset = RoleModel.objects.all()
serializer_class = RoleSearializer
class PowerViewSet(viewsets.ModelViewSet):
queryset = PowerModel.objects.all()
serializer_class = PowerSearializer
urls.py
from rest_framework import routers
from .views import UserViewSet, RoleViewSet, PowerViewSet
router = routers.DefaultRouter()
router.register("user", UserViewSet)
router.register("role", RoleViewSet)
router.register("power", PowerViewSet)
urlpatterns = [] + router.urls
print(urlpatterns)