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/
相关推荐
zstar-_6 分钟前
一套个人知识储备库构建方案
python
Amo Xiang29 分钟前
《100天精通Python——基础篇 2025 第5天:巩固核心知识,选择题实战演练基础语法》
python·选择题·基础语法
江梦寻39 分钟前
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
开发语言·后端·python·macos·架构·策略模式
霖檬ing42 分钟前
Python——MySQL远程控制
开发语言·python·mysql
miniwa1 小时前
Python编程精进:CSV 模块
python
风象南1 小时前
SpringBoot的4种死信队列处理方式
java·spring boot·后端
互联网全栈架构2 小时前
遨游Spring AI:第一盘菜Hello World
java·人工智能·后端·spring
coderSong25687 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊8 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1188 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn