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/
相关推荐
调试人生的显微镜17 小时前
前端一般用什么开发工具?一文看懂从入门到专业的完整工具链
后端
夜幽青玄17 小时前
mybatis-plus调用报 org.springframework.dao.DataIntegrityViolationException 错误处理
开发语言·python·mybatis
golang学习记17 小时前
Go 高效开发的“十诫”:写出可维护、安全、高性能的 Go 代码
后端
洛克大航海18 小时前
5-SpringCloud-服务链路追踪 Micrometer Tracing
后端·spring·spring cloud·zipkin·micrometer
小咕聊编程18 小时前
【含文档+PPT+源码】基于spring boot的固定资产管理系统
java·spring boot·后端
用户685453759776918 小时前
🎮 Java设计模式:从青铜到王者的代码修炼手册
java·后端
兮动人18 小时前
Java 线程详解
后端
纪卓志George18 小时前
从 AWS 故障反思:广告系统的全球单元化部署
后端·架构
用户9047066835718 小时前
redis-cli Could not connect to Redis at 127.0.0.1:6379: Connection refused
后端
学习OK呀18 小时前
python 多环境下配置运行
后端