Django是通过Model来操作数据库的,无论我们使用的是mysql还是sqlite3,Django都会帮我们自动生成相应数据库类型的sql语句,所以我们不需要关注sql语句和类型,Django会帮我们自动生成,我们只需要会写model就可以了。
Django根据代码中编写的类来自动生成数据库表。我们写的类表示数据库的表。
基本原则:
- 每个模型在Django中表现为一个Python类
- 每个模型都是继承自django.db.models.Model,都是django.db.models.Model的子类
- 模型里的每个类都代表着数据库中的一个表
- 模型的每个字段(属性)都代表着数据库表中的某一列
- Django会自动生成访问数据库的API
下面我们以博客项目为例,经过分析,完成博客项目我们需要存储六种数据:文章分类、文章、文章标签、幻灯图、推荐位、友情链接。每种数据一个表。
from django.db import models from django.contrib.auth.models import User #导入Django自带用户模块 # 文章分类 class Category(models.Model): name = models.CharField('博客分类', max_length=100) index = models.IntegerField(default=999, verbose_name='分类排序') class Meta: verbose_name = '博客分类' verbose_name_plural = verbose_name def __str__(self): return self.name #文章标签 class Tag(models.Model): name = models.CharField('文章标签',max_length=100) class Meta: verbose_name = '文章标签' verbose_name_plural = verbose_name def __str__(self): return self.name #推荐位 class Tui(models.Model): name = models.CharField('推荐位',max_length=100) class Meta: verbose_name = '推荐位' verbose_name_plural = verbose_name def __str__(self): return self.name #文章 class Article(models.Model): title = models.CharField('标题', max_length=70) excerpt = models.TextField('摘要', max_length=200, blank=True) category = models.ForeignKey(Category, on_delete=models.DO_NOTHING, verbose_name='分类', blank=True, null=True) #使用外键关联分类表与分类是一对多关系 tags = models.ManyToManyField(Tag,verbose_name='标签', blank=True) #使用外键关联标签表与标签是多对多关系 img = models.ImageField(upload_to='article_img/%Y/%m/%d/', verbose_name='文章图片', blank=True, null=True) body = models.TextField() user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name='作者') """ 文章作者,这里User是从django.contrib.auth.models导入的。 这里我们通过 ForeignKey 把文章和 User 关联了起来。 """ views = models.PositiveIntegerField('阅读量', default=0) tui = models.ForeignKey(Tui, on_delete=models.DO_NOTHING, verbose_name='推荐位', blank=True, null=True) created_time = models.DateTimeField('发布时间', auto_now_add=True) modified_time = models.DateTimeField('修改时间', auto_now=True) class Meta: verbose_name = '文章' verbose_name_plural = '文章' def __str__(self): return self.title #Banner class Banner(models.Model): text_info = models.CharField('标题', max_length=50, default='') img = models.ImageField('轮播图', upload_to='banner/') link_url = models.URLField('图片链接', max_length=100) is_active = models.BooleanField('是否是active', default=False) def __str__(self): return self.text_info class Meta: verbose_name = '轮播图' verbose_name_plural = '轮播图' #友情链接 class Link(models.Model): name = models.CharField('链接名称', max_length=20) linkurl = models.URLField('网址',max_length=100) def __str__(self): return self.name class Meta: verbose_name = '友情链接' verbose_name_plural = '友情链接'
其中,文章与分类是一对多的关系,文章与标签是多对多的关系,文章与作者是一对多的关系,文章与推荐位是一对多的关系;
上面Article类中的img表示图片封面字段,article_img/为上传目录,%Y/%m/%d/为自动在上传的图片上加上文件上传的时间。
完成上面的model编写之后,我们仅仅是完成了model的代码编写,但是这些模型并没有真正的在数据库中创建表,我们接下来就需要进行数据库迁移!
在进行数据库迁移之前我们需要先配置Django项目使用MySQL数据库(如果使用默认的数据库那就不用配置了),mysql配置请参考:Django项目如何使用mysql数据库
在数据库配置好之后,我们就可以来进行数据库迁移啦!数据库迁移非常的简单,只需要执行以下命令即可:
python3 manage.py makemigrations
python3 manage.py migrate
迁移的时候可能会提示需要安装Pillow,出现这个错误的原因是因为我们的Article和Banner类使用了图片字段ImageField,我们需要用到图片处理包,按照错误提示执行安装Pillow模块就可以了:
pip3 install Pillow
Pillow模块安装成功之后,再执行迁移数据库:
数据库迁移成功之后,程序会在blog下的migrations目录里自动生成几个000开头的文件,文件里面记录着数据库迁移记录:
数据库迁移后查看数据库中表,表名默认为:应用名称_模型名称:
至此,我们的模型model就创建成功了!