[ DRF使用多对多模型案例 ]


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)