> 技术文档 > DRF - 博客列表API

DRF - 博客列表API


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

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

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

 

 

2.  创建Django项目、app

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

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

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

requirements.txt

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

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

  • 项目目录列表

  • 在settings中,首先注册apps、其次配置数据库环境、再配置DRF的相关配置
# 注册appsINSTALLED_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 pathfrom 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 APIViewfrom rest_framework.response import Responsefrom rest_framework import serializersfrom 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.Blog fileds = [\"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.UserInfo fields = [\"id\", \"username\"]creator = BlogUserInfoSerializer()# 在本来的类序列器中写进去就行class Meta: model = models.Blog fields = [\"creator\"] 
  • 完整版
class BlogUserSerializer(serializers.ModelSerializer): class Meta: model = models.UserInfo fields = [\"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.Blog fields = [\"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,需要了解基础源码,再来看本篇文章你会更上一层楼