DRF - 博客列表API

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

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

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

2. 创建Django项目、app

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

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

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

requirements.txt

python 复制代码
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的相关配置
python 复制代码
# 注册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模型)

python 复制代码
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

python 复制代码
from django.urls import path
from api import views

urlpatterns = [
    # path('admin/', admin.site.urls),
    path('api/blog/',views.BlogView.as_view()),
]

6.3 views.py

(1)第一种方式:使用钩子函数进行处理
  • 关键点:
python 复制代码
creator = serializers.SerializerMethodField()


def get_creator(self, obj):
    return obj.creator.username
  • 完整版:
python 复制代码
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import serializers
from api import models


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


class 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)第二种方式:使用了继承,个人觉得第二种方式输出的数据更清晰明了
  • 关键点:
python 复制代码
class BlogUserInfoSerializer(serializers.ModelSerializer):
    class Meta:
        model = models.UserInfo
        fields = ["id", "username"]



creator = BlogUserInfoSerializer()

# 在本来的类序列器中写进去就行
class Meta:
    model = models.Blog
    fields = ["creator"]
   
  • 完整版
python 复制代码
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,需要了解基础源码,再来看本篇文章你会更上一层楼

相关推荐
Wonderful U8 小时前
基于 Django Channels 与 WebSocket 的实时聊天室:群聊、私聊、离线消息与持久化存储全实现
python·websocket·django
Wonderful U8 小时前
Python+Django实战|校园二手闲置交易平台:从实名认证到交易闭环的完整校园电商解决方案
开发语言·python·django
Dxy12393102161 天前
Django 数据库 ENGINE 完全指南:选错了,性能差 10 倍
python·django
Wonderful U1 天前
基于Python+Django的在线题库与智能阅卷系统:从痛点分析到完整实现
开发语言·python·django
Wonderful U1 天前
基于Python爬虫+Django的轻量化天气预报系统:从数据抓取到可视化展示的完整实战
爬虫·python·django
俊哥工具1 天前
不用打开文件也能预览!支持压缩包、PDF、音视频
python·智能手机·django·pdf·计算机外设·virtualenv
Dxy12393102161 天前
Django 三种 ENGINE 的区别
python·django·sqlite
weixin_BYSJ19872 天前
springboot旅游管理系统04470(附源码+开发文档+部署教程)
java·spring boot·python·算法·django·flask·旅游
Wonderful U2 天前
基于Python+Django的私有化云笔记系统:从痛点分析到完整实现
笔记·python·django
Dxy12393102162 天前
Django 模型查询中的数据库连接池配置指南
数据库·django·sqlite