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/