多对多视图集(ModelViewSet)的基本使用(适用于后台管理)

Modes.py

from django.db import models

class Studentmodel(models.Model):
    name = models.CharField(max_length=32)
    course = models.ManyToManyField(to='Coursemodel',related_name="student")

    class Meta:
        db_table = 'student'

class Coursemodel(models.Model):
    name = models.CharField(max_length=32)

    class Meta:
        db_table = 'course'

Serializer.py

添加和修改涉及代码的重写 否则只能read或者write

from rest_framework.serializers import ModelSerializer
from rest_framework import serializers
from .models import Studentmodel, Coursemodel


class CourseSer(ModelSerializer):
    class Meta:
        model = Coursemodel
        fields = "__all__"


class StudentSer(ModelSerializer):
    course = CourseSer(read_only=True, many=True)
    course_list = serializers.ListField(write_only=True)
    # 添加
    def create(self, validated_data):
        # print(validated_data)
        name = validated_data.get('name')
        course_list = validated_data.get('course_list')
        Stu = Studentmodel.objects.create(name=name)
        for course in course_list:
            Stu.course.add(course)
        return Stu
    # 修改
    def update(self, instance, validated_data):
        name = validated_data.get('name')
        course_list = validated_data.get('course_list')
        instance.name = name
        instance.course.set(course_list)
        instance.save()
        return instance

    class Meta:
        model = Studentmodel
        fields = "__all__"

utils.py

from rest_framework.pagination import PageNumberPagination

class MyFenye(PageNumberPagination):
    page_size = 3 # 每页的数据条数
    page_query_param = 'page' # 获取的参数(当前页数)

View.py

from .models import Studentmodel,Coursemodel
from .serializer import StudentSer,CourseSer
from rest_framework.viewsets import ModelViewSet
from utils import MyFenye

class CourseView(ModelViewSet):
    queryset = Coursemodel.objects.all() #获取数据库所有数据
    serializer_class = CourseSer # 选择使用的序列化器
    pagination_class = MyFenye # 选择分页器


class StuView(ModelViewSet):
    queryset = Studentmodel.objects.all()
    serializer_class = StudentSer
    pagination_class = MyFenye

urls.py

主路由
from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('M2M.urls')),
]

使用了路由分发

from django.urls import path, include
from rest_framework import routers
from .views import StuView, CourseView

router = routers.DefaultRouter()
router.register('stu', StuView)
router.register('course', CourseView)

urlpatterns = [
    path('', include(router.urls))
]
启动服务

http://127.0.0.1:8000/api/course/
获取course表的所有数据

http://127.0.0.1:8000/api/course/1/

获取course表pk为1的数据

http://127.0.0.1:8000/api/stu/
通过这个链接进行获取全部的数据

http://127.0.0.1:8000/api/stu/1/
获取主键为1的数据

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值