博文接口实现–Django播客系统(八)
- 功能分析
POST /posts/ 文章发布,试图类PostView
请求体 application/json
{
"title":"string",
"content":"string"
}
响应
201 发布成功
400 请求数据错误
GET /posts/(\d+) 查看指定文章,试图函数getpost
响应
200 成功返回文章内容
404 文章不存在
GET /posts/ 文章列表页,视图类PostView
响应
200 成功返回文章列表
创建博文应用
-
python manage.py startapp post
-
注意:一定要把应用post加入到settings.py中,否则不能迁移
# djweb/settings.py中修改 INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'user', "post" ]
-
添加对应路由
-
修改djweb/urls.py文件
# 修改djweb/urls.py文件 urlpatterns = [ path('admin/', admin.site.urls), re_path(r'^$',index), re_path(r'^index$',index),#不同路径可以指向同一个函数执行 re_path(r'^users/',include("user.urls")), re_path(r'^posts/',include("post.urls")) ]
-
新建post/urls.py文件
# 新建post/urls.py文件 配置路由信息 from django.conf.urls import re_path from .views import PostView,getpost urlpatterns = [ re_path(r'^$',PostView.as_view()), #/posts/ 视图函数PostView re_path(r'^(\d+)$',getpost), ]
-
修改post/views.py文件
from django.http import HttpResponse,HttpRequest,JsonResponse from django.views.decorators.http import require_GET from django.views import View class PostView(View): pass def getpost(request:HttpRequest,id): print(id) return JsonResponse({ },status=201)
-
-
构建数据库模型
- 修改post/models.py文件
from django.db import models from user.models import User # post表 class Post(models.Model): class Meta: db_table = "post" id = models.AutoField(primary_key=True) title = models.CharField(max_length=256,null=False) postdate = models.DateTimeField(null=False) # 从post查看作者,从post查看内容 author = models.ForeignKey(User,on_delete=models.PROTECT) #指定外键,migrate会生成author_id字段 # self.content可以访问Content实例,其内容是self.content.content def __repr__(self): return '<Post {} {} {} {} >'.format( self.id,self.title,self.author_id,self.content ) __str__ = __repr__ # content表 class Content(models.Model): class Meta: db_table = "content" # 没有主键,会自动创建一个自增主键 post = models.OneToOneField(Post,primary_key=True,on_delete=models.PROTECT) #一对一,这边会有一个外键post_id引用post.id content = models.TextField(null=False) def __repr__(self): return "<Content {} {} >".format(