Django REST Framework (DRF)

1. 创建一个模型

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

python 复制代码
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.title
    class Meta:
        verbose_name = "文章"
        verbose_name_plural = "文章列表"
        ordering = ['-created_at']  # 按创建时间倒序排列

2.创建序列化器

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

python 复制代码
from rest_framework import serializers
from .models import  ArticleSer
from django.contrib.auth.models import User

class ArticleSerializer(serializers.ModelSerializer):
    author = UserSerializer()  # 使用嵌套序列化器 返回作者的详细信息
    #author_name = serializers.SerializerMethodField() #返回作者的用户名
    author_name = serializers.SerializerMethodField() #返回作者的用户名
    #author = serializers.StringRelatedField()  # 显示 __str__ 方法的结果
    image_url = serializers.SerializerMethodField()  # 新增字段用于返回完整图片 URL
    class Meta:
        model = Article
        fields = ['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

python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status
from .models import Item
from .serializers import ItemSerializer




class 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

python 复制代码
from django.urls import path
from . import views

urlpatterns = [
    path('items/', views.ItemList.as_view(), name='item-list'),
]

5.访问

python 复制代码
curl http://127.0.0.1:8000/api/items/
相关推荐
寻星探路7 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
想用offer打牌8 小时前
MCP (Model Context Protocol) 技术理解 - 第二篇
后端·aigc·mcp
KYGALYX10 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了10 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
ValhallaCoder10 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
爬山算法10 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
Moment11 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
八零后琐话11 小时前
干货:程序员必备性能分析工具——Arthas火焰图
开发语言·python
Cobyte11 小时前
AI全栈实战:使用 Python+LangChain+Vue3 构建一个 LLM 聊天应用
前端·后端·aigc