ModelViewSet实现过滤和增删改查

局部配置过滤

from django.shortcuts import render
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters
from rest_framework.pagination import PageNumberPagination
from rest_framework.viewsets import ModelViewSet

from apps.app01.models import *
from apps.app01.sers import *

class MyPage(PageNumberPagination):
    page_size_query_param = 'max_page'
    page_query_param = 'page'

class GoodsListViewSet(viewsets.ModelViewSet):
    """
    list:
        商品列表
    read:
        商品详情
    create:
        增加商品
    update:
        更改商品
    partial_update:
        部分更改
    delete:
        删除商品
    """
    # 必须定义一个默认排序否则会报错
    queryset = Goods.objects.all().order_by('id')
    # 分页
    pagination_class = MyPage
    serializer_class = GoodsSerializer     #展示序列化器所有信息
    # 过滤
    filter_backends = (DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter)
    filter_class = GoodsFilters
    # 搜索
    search_fields = ('name', 'goods_brief', 'goods_desc')
    # 排序
    ordering_fields = ('sold_num', 'shop_price')

全局配置ModelViewSet过滤及分页

REST_FRAMEWORK = {
    # 限次
    'DEFAULT_THROTTLE_CLASSES': (
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle'
    ),
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/day',
        'user': '1000/day'
    },
    # 过滤器
    'DEFAULT_FILTER_BACKENDS': (
        'django_filters.rest_framework.DjangoFilterBackend',
        'rest_framework.filters.OrderingFilter'),
    # 分页
    # 'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    # 'PAGE_SIZE': 3  # 每页数目
}

View单独增上改查,没有分页

view界面

#课程类别
class CourseTypeView(ModelViewSet):
    queryset = CourseType.objects.all()         //获取所有数据
    serializer_class = CourseTagSer     //序列化器,完成增删改查

url路由页面

routers = DefaultRouter()         默认使用defaul路由
routers.register("type",CourseTypeView)      注册这个模型类
urlpatterns = [

    path('', include(routers.urls)),         #子路由配置
]

ModelViewSet使用action使用规范

view界面

class BookInfoModelViewSet(ModelViewSet):
    queryset = Books.objects.all()
    serializer_class =BooksSer
    # 搜索
    search_fields=('=title','=desc')
    # 排序
    ordering_fields = ('read', 'pub_date')


    @action(methods=['get'],detail=False)    #用get方法,不带pk时候用False
    def is_del(self,request):
        #获取删除的图书列表
        queryset=self.queryset.filter(is_delete=True)
        ser=self.serializer_class(queryset,many=True)
        return JsonResponse(ser.data,safe=False)

    @action(methods=['get'], detail=True)   #如果为True必须携带pk
    def only_title(self,request,pk):
        #如果带pk,self,中提供了根据pk获取的那个对象
        instance=self.get_object()   #根据pk,获取到的数据
        data_dict = {
            'title': instance.title,
            'pub_date': instance.pub_date,
            'desc': instance.desc,
            'read': instance.read,
            'is_delete': instance.is_delete
        }
        return JsonResponse(data_dict)

    @action(methods=['get'], detail=False)  # 用get方法,不带pk时候用False
    def is_del(self, request):
        # 获取删除的图书列表
        queryset = self.queryset.update(is_delete=True)          #调用上面的获取所有数据,然后吧数据全部修改为删除状态
        ser = self.serializer_class(queryset, many=True)            #序列化展示
        return JsonResponse({'msg':'操作成功'})

url路由页面

from django.urls import path
from rest_framework.routers import DefaultRouter,SimpleRouter       #SimpleRouter为简单的路由展示

from demoapp.views import BooksListView, BooksInfoView, BookInfoModelViewSet


router=DefaultRouter()                    #调用DefaultRouter
router.register('books',BookInfoModelViewSet)        #导入url后面会自动生成/,调用view




urlpatterns=[
    # path('books/',BooksListView.as_view()),    #添加数据
    # path('books/<int:pk>/',BooksListView.as_view()),    #查询单个数据
    # path('books/is_del/',BooksInfoView.as_view()),
    # path('booksinfo/is_del/',BookInfoModelViewSet.as_view({'get': 'is_del'})),
    # path('booksinfo/<int:pk>/only_title/',BookInfoModelViewSet.as_view({'get': 'only_title'}))


]

urlpatterns+=router.urls          #拼接modelviewset里的路由
print(router.urls)
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的使用Django Rest Framework ModelViewSet实现增删改查的小案例。 首先,我们需要创建一个Django项目并安装Django Rest Framework。在这个例子,我们将创建一个简单的博客应用程序,包含两个模型:文章和评论。每篇文章可以有多个评论。 1. 创建Django项目和应用程序 ``` $ django-admin startproject blog_project $ cd blog_project $ python manage.py startapp blog ``` 2. 在blog应用程序创建模型 我们将创建两个模型:文章和评论。 在blog/models.py添加以下代码: ``` from django.db import models class Post(models.Model): title = models.CharField(max_length=200) content = models.TextField() class Comment(models.Model): post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments') content = models.TextField() ``` 3. 创建序列化器 在blog/serializers.py添加以下代码: ``` from rest_framework import serializers from .models import Post, Comment class CommentSerializer(serializers.ModelSerializer): class Meta: model = Comment fields = ('id', 'content') class PostSerializer(serializers.ModelSerializer): comments = CommentSerializer(many=True, read_only=True) class Meta: model = Post fields = ('id', 'title', 'content', 'comments') ``` 4. 创建视图集 在blog/views.py添加以下代码: ``` from rest_framework import viewsets from .models import Post, Comment from .serializers import PostSerializer, CommentSerializer class PostViewSet(viewsets.ModelViewSet): queryset = Post.objects.all() serializer_class = PostSerializer class CommentViewSet(viewsets.ModelViewSet): queryset = Comment.objects.all() serializer_class = CommentSerializer ``` 5. 配置URL路由 在blog_project/urls.py添加以下代码: ``` from django.urls import include, path from rest_framework import routers from blog.views import PostViewSet, CommentViewSet router = routers.DefaultRouter() router.register(r'posts', PostViewSet) router.register(r'comments', CommentViewSet) urlpatterns = [ path('', include(router.urls)), ] ``` 6. 运行服务器并测试API ``` $ python manage.py runserver ``` 现在我们可以使用浏览器或curl访问API。例如,要获取所有文章,可以使用以下URL: ``` http://localhost:8000/posts/ ``` 要创建一篇新文章,可以使用以下curl命令: ``` $ curl -X POST -d '{"title": "My First Post", "content": "Hello World"}' -H 'Content-Type: application/json' http://localhost:8000/posts/ ``` 要更新一篇文章,可以使用以下curl命令: ``` $ curl -X PUT -d '{"title": "My Updated Post", "content": "Hello World Again"}' -H 'Content-Type: application/json' http://localhost:8000/posts/1/ ``` 要删除一篇文章,可以使用以下curl命令: ``` $ curl -X DELETE http://localhost:8000/posts/1/ ``` 以上是使用Django Rest Framework ModelViewSet实现增删改查的简单案例。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值