在django项目的开始首先就是数据库的设计,这次不用django默认的sqlite数据库,使用mysql数据库,首先要接入mysql数据库
要接入mysql首先要有mysql驱动,python3 :pip install mysqlclient
python2:mysqldb,注意,这是个大坑
在setting.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'data',
'USER':'root',
'PASSWORD':'root',
'HOST':'127.0.0.1',
}
这里修改数据库密码,由于是mysql,所以要先创建数据库data
接下来点击run,跑一下项目,就可以在mysql中看到默认生成的表(真的是好方便,人生苦短,我用django)
接下来创建app
步骤:
命令行中进入 manage.py同级目录
执行python manage.py startapp app名(可选)
然后编写我们app的models
这里我们使用django默认的user(上图默认创建的auth_user表)来拓展我们的业务,通过继承它,来使用它的表里面设计好的内容
from django.db import models
from datetime import datetime
from django.contrib.auth.models import AbstractUser
class UserProfile(AbstractUser):
nick_name = models.CharField(max_length=50, verbose_name='昵称', default='')
birthday = models.DateField(null=True, blank=True, verbose_name='生日')
gender = models.CharField(max_length=6, choices=(('male', '男'), ('female', '女')), default='female',
verbose_name='性别')
address = models.CharField(max_length=100, default='', verbose_name='地址')
mobile = models.CharField(max_length=11, null=True, blank=True, verbose_name='手机号')
image = models.ImageField(max_length=100, upload_to='image/%Y/%m', default='image?default.png', verbose_name='头像')
class Meta:
verbose_name = '用户信息'
verbose_name_plural = verbose_name
def __str__(self):
return self.username
编写好后,在setting中添加app,这里添加user
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
]
这里要创建我们的衍生表( UserProfile )还要在setting中添加一条代码
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'user',
]
AUTH_USER_MODEL = "user.UserProfile"
通过这条AUTO_USER_MODEL 的代码就可以创建userProfile表
然后提交我们的models,
命令行中进入 manage.py同级目录
执行python manage.py makemigratetions app名(可选)
在执行python manage.py migrate
就能看到我们的UserProfile衍生表
这里是利用了我们django的默认user模板,省写了很多代码,熟练以后挺方便的,一般的models只要继承models的Model就行了
class Course(models.Model): pass
使用mysql关系库就是因为因为各表之间有关系,表与表有主要一对多的关系,
那么如何实现一对多的关系呢?
下面通过course(课程表)与lesson(章节表)为例,一个课程对应多个章节,是一对多的关系,
只要在多的一方(lesson表)添加course的外键就行
class Course(models.Model): name = models.CharField(max_length=52, verbose_name='课程名字') desc = models.CharField(max_length=300, verbose_name='课程描述') detail = models.TextField(verbose_name='课程详情') degree = models.CharField(choices=(('cj', '初级'), ('zj', '中级'), ('gj', '高级')), max_length=2, verbose_name='难度') class Meta: verbose_name = '课程' verbose_name_plural = verbose_name # 章节信息 class Lesson(models.Model): course = models.ForeignKey(Course, verbose_name='课程') name = models.CharField(max_length=100, verbose_name='章节名') add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')