django版本3.1.5 安装DRF
表设计
from django.db import models
# Create your models here.
class Category(models.Model):
"""
文章分类
"""
name = models.CharField(verbose_name='分类', max_length=32)
def __str__(self):
return self.name
class Meta:
verbose_name = "文章分类"
verbose_name_plural = verbose_name
class Article(models.Model):
"""
文章表
"""
title = models.CharField(verbose_name='标题', max_length=32)
summary = models.CharField(verbose_name='简介', max_length=255)
content = models.TextField(verbose_name='文章内容')
category = models.ForeignKey(Category, on_delete=models.CASCADE, default="")
def __str__(self):
return self.title
class Meta:
verbose_name = "文章表"
verbose_name_plural = verbose_name
在app同目录的admin.py中注册数据表
admin.py from django.contrib import admin # Register your models here. from drf_app import models admin.site.register(models.Category) admin.site.register(models.Article)
注册APP 注册drf_app,在settings中INSTALLED_APPS注册drr_app:
settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'drf_app.apps.DrfAppConfig',
'rest_framework',
]
写路由
urls.py
from django.contrib import admin
from django.urls import path
from django.conf.urls import url
from django.urls import re_path
from drf_app import views
urlpatterns = [
path('admin/', admin.site.urls),
# 文章类型路由
path('drf/category/', views.NewCategoryView.as_view()),
re_path('^drf/category/(?Pd+)/$', views.NewCategoryView.as_view()),
# 文章路由
path('drf/article/', views.NewArticleView.as_view()),
re_path('^drf/article/(?Pd+)/$', views.NewArticleView.as_view()),
]
视图函数
views.py
from drf_app import models
from rest_framework.response import Response
from rest_framework.views import APIView
from drf_app.serializer import *
class NewArticleView(APIView):
def get(self, request, *args, **kwargs):
pk = kwargs.get('pk') # 获取单条数据的pk值
if not pk:
queryset = models.Article.objects.all()
ser = ArticleSerializer(instance=queryset, many=True)
return Response(ser.data) # Response 只接受列表,字典,字符串类型的数据
else:
if models.Article.objects.filter(pk=pk):
obj_dict = models.Article.objects.filter(pk=pk).first()
ser = ArticleSerializer(instance=obj_dict, many=False)
return Response(ser.data)
else:
return Response({"code": "500", "msg": "记录不存在"})
serializers模块:显示关联表的数据值
serializer.py
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = models.Category
fields = "__all__"
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = ['id', 'title', 'summary', 'content', 'category']
准备数据


启动程序
页面请求接口
GET /drf/article/12/
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept
{
"id": 12,
"title": "serializer",
"summary": "序列化简介",
"content": "序列化测试",
"category": 4
}
ArticleSerializer 类添加 depth 字段,返回外键所有的字段
class ArticleSerializer(serializers.ModelSerializer):
class Meta:
model = models.Article
fields = ['id', 'title', 'summary', 'content', 'category']
depth = 1 # 返回外键所有的字段
如果想要能够更加个性化的获取外键关联表的字段数据,可以对外键进行实例化 CategorySerializer()
class ArticleSerializer(serializers.ModelSerializer):
category = CategorySerializer() # 返回字段根据 CategorySerializer 变化
class Meta:
model = models.Article
fields = ['id', 'title', 'summary', 'content', 'category']
GET /drf/article/12/