当前位置: 首页 > news >正文

Django REST Framework (DRF)

1. 创建一个模型

在 myapp/models.py 中创建一个模型,比如:

from django.db import models#文章
class Article(models.Model):category = models.ForeignKey(Category, on_delete=models.CASCADE,null=True, blank=True,verbose_name='栏目')  # 外键,指向栏目title = models.CharField(max_length=200,verbose_name='标题')image = models.ImageField(upload_to='thumbnails/', blank=True, null=True, verbose_name="缩略图")summary = models.TextField(max_length=200,blank=True,null=True,verbose_name="简介")#content = models.TextField(verbose_name="内容")  # 内容content = CKEditor5Field(verbose_name="内容")  # 内容author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='articles', verbose_name="发布人")  # 发布人status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name="状态")  # 状态created_at = models.DateTimeField(auto_now_add=True, verbose_name="创建时间")  # 创建时间updated_at = models.DateTimeField(auto_now=True, verbose_name="更新时间")  # 更新时间views = models.PositiveIntegerField(default=0, verbose_name="浏览量")  # 浏览量tags = models.ManyToManyField('Tag', blank=True, related_name='articles', verbose_name="标签")  # 标签def __str__(self):return self.titleclass Meta:verbose_name = "文章"verbose_name_plural = "文章列表"ordering = ['-created_at']  # 按创建时间倒序排列

 

2.创建序列化器

在 myapp/serializers.py 中,创建一个序列化器来将 Item 模型转化为 JSON 格式

from rest_framework import serializers
from .models import  ArticleSer
from django.contrib.auth.models import Userclass ArticleSerializer(serializers.ModelSerializer):author = UserSerializer()  # 使用嵌套序列化器 返回作者的详细信息#author_name = serializers.SerializerMethodField() #返回作者的用户名author_name = serializers.SerializerMethodField() #返回作者的用户名#author = serializers.StringRelatedField()  # 显示 __str__ 方法的结果image_url = serializers.SerializerMethodField()  # 新增字段用于返回完整图片 URLclass Meta:model = Articlefields = ['id', 'image','title', 'content', 'author','author_name' ,'image_url','created_at']def get_author_name(self, obj):return obj.author.username  # 返回作者的用户名def get_image_url(self, obj):if obj.image:  # 确保图片字段不为空request = self.context.get('request')if request is not None:  # 检查 request 是否存在return request.build_absolute_uri(obj.image.url)else:return f"{settings.DOMAIN_URL}{obj.image.url}"return None

 

3. 创建视图

在 myapp/views.py 中,使用 DRF 的视图来处理 HTTP 请求。你可以使用 APIView 或者 ViewSet

from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Item
from .serializers import ItemSerializerclass BaseAPIView(APIView):#authentication_classes = [JWTAuthentication]  # 仅使用 JWT 认证permission_classes = [IsAuthenticated]       # 默认需要认证#permission_classes = []  # 无需认证class ArticleAPIView(BaseAPIView):def get(self, request):articles = Article.objects.all()# 使用 SearchFilter 进行搜索search_param = request.query_params.get('search', None)author_id = request.query_params.get('author_id', None)# # 模糊搜索# if search_param:#     articles = articles.filter(title__icontains=search_param)# #精确搜索id# if author_id:#     articles = articles.filter(author_id=author_id)  # 按作者 ID 精确搜索# 使用 Q 对象进行复杂查询query = Q()if search_param:query &= (Q(title__icontains=search_param) | Q(content__icontains=search_param))if author_id:query &= Q(author_id=author_id)# 应用查询条件articles = articles.filter(query)# 实例化分页器paginator = PageNumberPagination()paginator.page_size = 1  # 每页显示 2 条数据# 分页处理result_page = paginator.paginate_queryset(articles, request)# 序列化分页后的结果serializer = ArticleSerializer(result_page, many=True)# # 返回分页响应# return paginator.get_paginated_response(serializer.data)# 构造自定义响应数据response_data = {"status": 200,  # 显式添加状态码"message": "Success",  # 可选:添加成功消息"data": {"count": paginator.page.paginator.count,"next": paginator.get_next_link(),"previous": paginator.get_previous_link(),"results": serializer.data  # 实际数据}}return Response(response_data, message="返回成功")

 4.配置 URL

from django.urls import path
from . import viewsurlpatterns = [path('items/', views.ItemList.as_view(), name='item-list'),
]

5.访问

curl http://127.0.0.1:8000/api/items/

 

相关文章:

  • 神经网络优化 - 高维变量的非凸优化
  • 卡尔曼滤波-从公式到理解
  • Flink调优面试题及参考答案20道
  • 搭建用友U9Cloud ERP及UAP IDE环境
  • Ubuntu 安装cuda踩坑记录
  • CNN卷积神经网络
  • PyCharm Flask 使用 Tailwind CSS 配置
  • Centos7.6安装JDK 1.8教程
  • ESP32- 开发笔记- 硬件设计-ESP32-C3 天线设计-利用嘉立创EDA来设计
  • 力扣算法ing(59 / 100)
  • B端网站建设,怎样平衡功能与美观,满足企业多元需求?
  • 【测试工具】JMeter使用小记
  • Dell戴尔服务器 PowerEdge R750xs + window server2012r2 || 2016
  • kafka报错:The Cluster ID doesn‘t match stored clusterId Some in meta.properties
  • 数据结构|排序算法(三)选择排序 堆排序 归并排序
  • 【AI】React Native中使用Zustand框架及自动生成选择器
  • Uniapp微信小程序:轻松获取用户头像和昵称
  • 【长按图片识别】uniapp vue开发时,点击图片识别—实现转发、收藏、识别图片二维码
  • git tag 标签
  • 基于pycatia的CATIA自动化干涉检测系统开发全解析
  • 金爵奖主竞赛单元评委名单公布,中国评委有黄渤、咏梅等人
  • 上影节开幕影片《酱园弄·悬案》,陈可辛执导,章子怡主演
  • 重庆一男大学生掉进化粪池死亡,重庆对外经贸学院:以学校通报为准
  • 国家发改委:系统谋划7方面53项配套举措,推动民营经济促进法落地见效
  • 5月LPR下调:1年期、5年期以上品种均下调10个基点
  • 上海文化馆服务宣传周启动,为市民提供近2000项活动