当前位置: 首页 > news >正文

DRF - 博客列表API

 这篇文章主要针对于对Django-DRF的运用,小白可能需要点基础

  • 使用DRF中的组件序列化器(serializers)
  • ORM

1. 创建Python项目,搭建虚拟环境

 

 

2.  创建Django项目、app

在pycharm中,虚拟环境下进行创建

# 创建Django项目
django-admin startproject blog .    (点标识创建在根目录下)
# 创建Django app
python manage.py startapp api

3. 安装关于Django-DRF的相关第三方模块

requirements.txt

asgiref==3.9.1
async-timeout==5.0.1
cffi==1.17.1
Django==4.2.23
django-redis==6.0.0
djangorestframework==3.16.0
pycparser==2.22
PyMySQL==1.1.1
pytz==2025.2
redis==6.2.0
sqlparse==0.5.3
typing_extensions==4.14.1
tzdata==2025.2

4. 对settings.py文件进行配置

  • 项目目录列表

  • 在settings中,首先注册apps、其次配置数据库环境、再配置DRF的相关配置
# 注册apps
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',# 新添加的配置'api.apps.ApiConfig','rest_framework',
]# 数据库名称、用户名、密码(我使用的是Mysql)
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': '','USER': '','PASSWORD': '','HOST': '127.0.0.1','PORT': '3306',}
}# DRf配置
REST_FRAMEWORK = {"UNAUTHENTICATED_USER": None
}

 5. 测试环境

可以在urls、views文件下写简单的代码进行简单的测试,成功后会显示这个下面这个界面

6. 编写代码

6.1 models.py(创建ORM模型)

from django.db import models# Create your models here.class UserInfo(models.Model):username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)token = models.CharField(verbose_name="TOKEN", max_length=64, null=True, blank=True,db_index=True)class Blog(models.Model):category_choices = ((1, "云计算"), (2, "Python全栈"), (3, "Go开发"))category = models.IntegerField(verbose_name="分类", choices=category_choices)image = models.CharField(verbose_name="封面", max_length=255)title = models.CharField(verbose_name="标题", max_length=32)summary = models.CharField(verbose_name="简介", max_length=256)text = models.TextField(verbose_name="博文")ctime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)creator = models.ForeignKey(verbose_name="创建者", to="UserInfo", on_delete=models.CASCADE)comment_count = models.PositiveIntegerField(verbose_name="评论数", default=0)favor_count = models.PositiveIntegerField(verbose_name="赞数", default=0)class Favor(models.Model):""" 赞 """blog = models.ForeignKey(verbose_name="博客", to="Blog", on_delete=models.CASCADE)user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)class Meta:constraints = [models.UniqueConstraint(fields=['blog', 'user'], name='uni_favor_blog_user')]class Comment(models.Model):""" 评论表 """blog = models.ForeignKey(verbose_name="博客", to="Blog", on_delete=models.CASCADE)user = models.ForeignKey(verbose_name="用户", to="UserInfo", on_delete=models.CASCADE)content = models.CharField(verbose_name="内容", max_length=150)create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)

 6.2 urls.py

from django.urls import path
from api import viewsurlpatterns = [# path('admin/', admin.site.urls),path('api/blog/',views.BlogView.as_view()),
]

 6.3 views.py

(1)第一种方式:使用钩子函数进行处理
  • 关键点:
creator = serializers.SerializerMethodField()def get_creator(self, obj):return obj.creator.username
  •  完整版:
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from api import modelsclass BlogViewSerializers(serializers.ModelSerializer):# 可以定义models中定义的choice字段,不会返回给接口数字,会返回给其汉字category = serializers.CharField(source="get_category_display")# 限制输出的字段,因为序列化器中处理的时间不好看ctime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")# 处理外键、多对多的数据creator = serializers.SerializerMethodField()class Meta:model = models.Blogfileds = ["category", "image", "title", "summary", "ctime", "comment_count", "favor_count", "creator"]def get_creator(self,obj):return obj.creator.usernameclass BlogView(APIview):def get(self,request):# 先获取数据库中的数据queryset = models.blog.object.all()# 交给序列化器进行处理,处理完的数据在ser.datai里面ser = BlogViewSerializer(instance=queryset,many=True)# 进行数据的整理,然后返回给API,前端想要的数据        context = {"code":200,"data":ser.data}return Response(context)
(2)第二种方式:使用了继承,个人觉得第二种方式输出的数据更清晰明了
  • 关键点:
class BlogUserInfoSerializer(serializers.ModelSerializer):class Meta:model = models.UserInfofields = ["id", "username"]creator = BlogUserInfoSerializer()# 在本来的类序列器中写进去就行
class Meta:model = models.Blogfields = ["creator"]
  • 完整版
class BlogUserSerializer(serializers.ModelSerializer):class Meta:model = models.UserInfofields = ["id", "username"]class BlogViewSerializer(serializers.ModelSerializer):category = serializers.CharField(source="get_category_display")ctime = serializers.DateTimeField(format="%Y-%m-%d %H:%M:%S")creator = BlogUserSerializer()class Meta:model = models.Blogfields = ["category", "image", "title", "summary", "ctime", "comment_count", "favor_count", "creator"]class BlogView(APIView):def get(self, request):queryset = models.Blog.objects.all()ser = BlogViewSerializer(instance=queryset, many=True)context = {"code": 200, "data": ser.data}return Response(context)

6.4 输出结果

 7. 总结

本功能主要使用了Django-DRF中序列化器、以及Django-ORM,需要了解基础源码,再来看本篇文章你会更上一层楼

http://www.dtcms.com/a/295675.html

相关文章:

  • GaussDB 数据库架构师(八) 等待事件概述-1
  • Spring Boot项目的模块继承父项目的全部依赖
  • 中国5G RedCap基站开通情况及2025年全年计划
  • 【ComfyUI学习笔记03】案例学习:图片放大的3个基本工作流
  • 基于规则架构风格对业务的重构
  • 与deepseek的问答:dot net与Borland VCL的关系
  • 抖音小游戏好做吗?
  • MySQL的底层原理--InnoDB记录存储结构
  • 【Unity开发】飞机大战项目实现总结
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • DBA常用数据库查询语句(2)
  • 【学习路线】JavaScript全栈开发攻略:前端到后端的完整征程
  • Redis数据库入门教程
  • Windchill用SQL获取所有组织下的所有用户
  • C++11之可变参数模板
  • ac日志报ARP-neighbor-failed问题定位过程
  • langchain+本地embedding模型+milvus实现RAG
  • ChatGPT Agent架构深度解析:OpenAI如何构建统一智能体系统
  • 青少年编程学习的新选择——《CCF GESP 直通车》与《GESP 编程能力等级认证一本通》深度剖析
  • 根据字符串数组的顺序重新排序 List顺序
  • 中国历史朝代顺序以及朝代歌
  • 核心数据结构:DataFrame
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-18,(知识点:传输线阻抗匹配方式)
  • OpenAI最新大模型GPT-4o体验之Code Copilot AI编程大模型
  • 电子书转PDF格式教程,实现epub转PDF步骤
  • Java 大视界 -- Java 大数据在智能家居能源管理与节能优化中的深度应用(361)
  • 多模态数据处理系统:用AI读PDF的智能助手系统分析
  • Maven Scope标签:解锁Java项目依赖管理的秘密武器
  • 安全逆向工程学习路线
  • 《Maven 核心基础笔记(第一天)》