Django博客开发教程:创建数据库模型
Django是通过Model操作数据库,不管你数据库的类型是MySql或者Sqlite,Django它自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要回写Model就可以了!
django根据代码中定义的类来自动生成数据库表。我们写的类表示数据库的表,如果根据这个类创建的对象是数据库表里的一行数据,对象.id 对象.value是每一行里的数据。
基本的原则如下:
每个模型在Django中的存在形式为一个Python类
每个模型都是django.db.models.Model的子类
模型里的每个类代表数据库中的一个表
模型的每个字段(属性)代表数据表的某一列
Django将自动为你生成数据库访问API
之前我们在前面的数据库设计分析文章里已经分析过数据库的结构。完成博客,我们需要存储六种数据:文章分类、文章、文章标签、幻灯图、推荐位、友情链接。每种数据一个表。
分类表结构设计:
表名:Category、分类名:name
标签表设计:
表名:Tag、标签名:name
文章表结构设计:
表名:Article、标题:title、摘要:excerpt、分类:category、标签:tags、推荐位、内容:body、创建时间:created_time、作者:user、文章封面图片img
幻灯图表结构设计:
表名:Banner、图片文本text_info、图片img、图片链接link_url、图片状态is_active。
推荐位表结构设计:
表名:Tui、推荐位名name。
友情链接表结构设计:
表名:Link、链接名name、链接网址linkurl。
其中:
文章和分类是一对多的关系,文章和标签是多对多的关系,文章和作者是一对多的关系,文章和推荐位是一对多关系(看自己的需求,也可以设计成多对多)。
打开blog/models.py,输入代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 | 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 = '友情链接' |
提示:上面的代码直接复制有可能导致其中几行代码格式缩进有问题,请自行检查一下。好多朋友就是在这出问题的。
这里面我们多增加了一个img图片封面字段,用于上传文章封面图片的,article_img/为上传目录,%Y/%m/%d/为自动在上传的图片上加上文件上传的时间。
里面的模型字段与模型元数据Meta选项详解我在这里就不做过多介绍,更多请点击文章数据模型字段及属性详解和模型元数据Meta选项详解了解。
我们已经编写了博客数据库模型的代码,但那还只是 Python 代码而已,Django 还没有把它翻译成数据库语言,因此实际上这些数据库表还没有真正的在数据库中创建。我们需要进行数据库迁移。
在迁移之前,我们先需要设置数据库,如果我们使用默认的数据库的话,就不需要设置,Django默认使用
sqlite3数据库,如果我们想使用Mysql数据库的话,则需要我们单独配置。我们打开settings.py文件,找到DATABASES,然后把它修改成如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ############修改成mysql如下: DATABASES = { 'default' : { 'ENGINE' : 'django.db.backends.mysql' , 'NAME' : 'test' , #你的数据库名称 'USER' : 'root' , #你的数据库用户名 'PASSWORD' : '445813' , #你的数据库密码 'HOST' : '' , #你的数据库主机,留空默认为localhost 'PORT' : '3306' , #你的数据库端口 }} #由于mysql默认引擎为MySQLdb,在__init__.py文件中添加下面代码 #在python3中须替换为pymysql,可在主配置文件(和项目同名的文件下,不是app配置文件)中增加如下代码 #import pymysql #pymysql.install_as_MySQLdb() #如果找不到pymysql板块,则通过pip install pymysql进行安装。 |
更多关于Django数据库的配置,请查看官方文档:数据库设置
数据库设置好之后,我们就依次输入下面的命令进行数据库迁移:
1 2 | python manage.py makemigrations python manage.py migrate |
迁移的时候,会有如下提示:
出现这个原因是因为我们的幻灯图使用到图片字段,我们需要引入图片处理包。提示里也给了我们处理方案,输入如下命令,安装Pillow模块即可:
1 | pip install Pillow |
安装成功之后再迁移数据库
数据库迁移成功之后,程序会在blog下的migrations目录里自动生成几个000开头的文件,文件里面记录着数据库迁移记录:
大家可以查看一下。了解迁移的过程。本文就不做过多介绍。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理