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.title
    class 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 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

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

from django.urls import path
from . import views

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

5.访问

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值