在前面7章中,我们首先编写了一个简单的电影爬虫,采集了猫眼电影的部分电影数据,再通过Django框架的2.0版本创建了一个Python WEB应用,并且借助于django-rest-framework模块,将Django Web应用改造成了一个提供Restful风格API接口的项目。
Django作为一个MTV架构的Web框架,通过数据模型提供数据,通过视图函数处理HTTP请求,通过模板渲染数据,便捷且高效。
而django-rest-framework模块则通过序列化器对数据模型的数据进行序列化,通过渲染器将序列化后的数据渲染为相应格式的数据,通过解析器接收客户端传递的数据并解析为序列化器可接受的数据形式。
通过上面的学习,我们大致了解了Django框架和django-rest-framwork模块的使用,但是上面创建的项目距离实际环境下的项目还是有很大的差距。我们在接下来的章节中,重新创建一个Django项目,充分使用Django2.0 和django-rest-franmwork模块的特性,完成一个完整的基于Django 2.0、提供Restful风格接口的Web服务。
1、规划项目和项目模型
在这个新的Django项目中,我们依然以电影为主题,与之前的项目不同的是,本次的项目引入用户系统,容许用户对电影进行评分(类似于豆瓣电影等电影评分网站)。
所以我们的Django中需要涉及到不止一个数据模型,它们分别是:
- 电影分类模型:存储电影的分类数据;
- 电影模型:存储电影数据;
- 用户模型:存储用户数据;
- 用户评分模型:存储用户对电影的评分数据;
其中,电影分类模型包含:
- 电影分类字段
电影模型包含:
- 链接到电影分类模型的外键字段;
- 电影名称字段;
- 上映时间字段;
- 是否观看字段;
- 数据创建时间字段;
用户模型包含:
- 用户性别字段;
- 用户姓名字段;
- 数据创建时间字段;
用户评分字段则包含:
- 链接到用户模型的外键字段;
- 链接到电影模型的外键字段;
- 电影分数字段;
- 评分日期字段;
2、创建Django项目和数据模型
上面规划好本次项目的模型之后,我们照例创建一个Django项目并进行相关的应用和数据模型的创建。
2.1、创建Django项目和应用
在命令行窗口使用django-admin命令的startproject选项创建一个Django项目:
django-admin startproject movieapi_new
接着进行movieapi目录,使用manage.py工具的startapp命令选项创建一个Django项目的应用:
python manage.py startapp userscore
这样,我们的Django项目和应用就已经创建完成。
2.2、设置Django项目
在Django项目和应用创建完成之后,我们也照例对项目进行一下基本的设置。
在setting.py文件中将userscore应用和django-rest-framwork模块添加到应用列表中:
# 代码位于/movieapi_new/movieapi_new/settings.py文件中
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'userscore',
]
其他就没有多少设置的了,另外因为本机只作演示,所以项目的数据库使用的还是文件型的sqlit3,如果有需要使用其他数据库的同学,请自行修改settings.py文件中DATABASES的内容,比如使用MySQL需要修改为:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'movies',
'USER': 'test1',
'PASSWORD': 'asd@asd',
'HOST': '127.0.0.1',
'PORT': '3306',
}
}
同时在settings.py同级目录的__init__.py文件中添加以下代码:
import pymysql
pymysql.install_as_MySQLdb()
2.3、创建数据模型
在将所需的应用和模块添加到项目中之后,我们来创建上一节设计的数据模型。
首先在/movieapi_new/userscore/models.py文件中写入以下代码:
from django.db import models
# 电影分类模型
class MovieCategory(models.Model):
name = models.CharField(max_length=200,verbose_name='电影分类')
class Meta:
ordering = ('name',)
verbose_name = '电影分类'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 电影模型
class Movie(models.Model):
name = models.CharField(max_length=200,verbose_name='电影名')
movie_category = models.ForeignKey(MovieCategory,related_name='电影分类',on_delete=models.CASCADE)
release_date = models.DateField(verbose_name='上映时间')
viewed = models.BooleanField(default=False,verbose_name='是否观看')
created = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
ordering = ('name',)
verbose_name = '电影'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 观众模型
class Viewer(models.Model):
MALE = 'M'
FEMALE = 'F'
GENDER_CHOICES = (
(MALE, '男'),
(FEMALE, '女'),
)
name = models.CharField(max_length=50, blank=False, default='',verbose_name='姓名')
gender = models.CharField(max_length=2,choices=GENDER_CHOICES,default=MALE,verbose_name='性别')
created = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
class Meta:
ordering = ('name',)
verbose_name = '观众'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
# 电影评分模型
class MovieScore(models.Model):
viewer = models.ForeignKey(Viewer,related_name='观众',on_delete=models.CASCADE)
movie = models.ForeignKey(Movie,on_delete=models.CASCADE)
score = models.IntegerField(verbose_name='评分')
score_date = models.DateTimeField(verbose_name='评分时间')
class Meta:
ordering = ('-score',)
verbose_name = '电影评分'
verbose_name_plural = verbose_name
在这里面,我们定义了4个数据模型——电影分类,电影,观众和电影评分。下面,我们生成数据模型的迁移文件并执行数据迁移。
2.4 生成数据模型
在models.py文件中定义好数据模型之后,我们来生成这些数据模型。
首先通过manage.py工具的makemigrations命令生成数据模型的迁移:
python manage.py makemigrations userscore
生成了数据模型的迁移文件之后,继续使用migrate命令执行迁移:
python manage.py migrate
这样,我们的数据模型就创建完成。下面可以基于这几个数据模型创建视图函数了。
文章版权所有:州的先生博客,转载必须保留出处及原文链接