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/