django基础入门(3)-设计模型
来源:互联网 发布:怎么给js里传参 编辑:程序博客网 时间:2024/06/04 19:59
1. 模型类
当前项目的开发,都是数据驱动的,即分析出项目中所需要存储的数据,然后设计数据表及表结构,接下来再使用设计好的页面对表完成数据的crud.
django中内嵌了ORM框架,不需要直接面向数据库编程,而是定义模型类,通过模型类和对象完成数据表的crud.
使用django进行数据库开发的步骤如下:
1.在models.py中定义模型类2.迁移3.通过类和对象完成数据crud
模型类定义在应用的models.py文件中,继承自models.Model类.
说明:不需要定义主键列,在生成时会自动添加,并且值为自动增长.
新闻分类表结构设计:
表名:NewsCategory新闻分类:cag_name
新闻表结构设计:
表名:NewsInfo新闻标题:news_title新闻摘要:news_summary新闻内容:news_contents所属分类:news_cag新闻时间:news_time
新闻分类-新闻列表的关系为一对多,根据设计,在models.py中定义模型类如下(自定义模型类必须继承自models.Model类):
from django.db import modelsclass NewsCategory(models.Model): cag_name = models.CharField(max_length=80) def __str__(self): return self.news_cagclass NewsInfo(models.Model): news_title = models.CharField(max_length=80) news_summary = models.CharField(max_length=200) news_contents = models.TextField() news_time = models.DateField() news_cag = models.ForeignKey('NewsCategory') def __str__(self): return self.news_title
注意上面两个模型类。其中NewsInfo类中定义:
news_cag = models.ForeignKey('NewsCategory')
表示sql操作中的外键。news_cag和NewsCategory通过此字段关联。我们以后可以通过此字段直接获取到对应的NewsCategroy信息。
news_title = models.CharField(max_length=80)这行代码表示定义了一个字段news_title, 类型是一个字符串类型,最大长度我们设置为80个字符。django会自动将此类型映射到数据库中对应的数据类型。
news_time = models.DateField()表示这是日期类型的字段。
news_contents = models.TextField()表示这是一个大文本类型的字段。两个模型类对应了两张表,当我们执行迁移(一会我们操作下,大家明白什么叫迁移了),django框架会根据我们的对象模型,来创建对应的表结构。
2. 迁移
1. 生成迁移文件:根据模型类生成创建表的语句;
2. 执行迁移文件:根据第一步生成的语句在数据库中创建表;python manage.py makemigrations
下面我们来执行迁移文件命令:
python manage.py migrate
大家可在Ubuntu中安装DB Browser for SqlLite软件,一款可视化sqlite数据库的带图形界面的工具。
3. 数据操作
我们可进入django shell,进行简单的数据操作, 按ctrl+d或输入quit()可以退出shell. 我们就像在命令终端进行python编码一样,来了解下如下操作数据。
进入项目shell命令如下:
python manage.py shell
1. 插入数据:
# 引入NewsList和NewsCategory类from News.models import NewsCategory, NewsListimport datetime# 1. 创建新闻分类对象nc = NewsCategory()nc.news_cag = "Military News"# 2. 将新分类信息插入到数据库中nc.save()# 1. 创建新闻类对象、news = NewsList()news.news_title = "news1 title"news.news_summary = "news1 summary"news.news_contents = "news1 contents"news.news_time = datetime.date(1990, 10, 10)# 2. 将新闻对象如何数据库中news.save()shell中操作如下:
我们创建NewsCategory对象,此对象中包含了一个save方法。每一个继承了models.Model的模型类,都默认有这个方法。我们创建新的对象,并给对象的实例属性成员赋值,调用save方法,就会将此对象插入到数据库中。
执行结果如下(使用上面所说的sqllite可视化软件):
2. 修改数据
# 引入NewsList和NewsCategory类from News.models import NewsCategory, NewsListimport datetime# 1. 首先根据新闻id获得数据news = NewsList.objects.get(pk=1)# 2. 修改本条数据news.news_title = "new news title"# 3. 保存修改后的结果news.save()
其中cag = NewsCategory.objects.get(pk=1), pk就代表中表中的主键,objects是NewsCategory模型类的对象属性,每一个继承了models.Model类的模型类,都默认有一个名字叫objects的属性,这个对象属性中包含了很多对该模型类进行数据操作的方法,我们这里就使用了get方法,用于从数据库中获取一条数据,其中参数pk代表数据库表中的主键,也可以直接指定主键字段名,默认是id. 我们从表中读取id为1的数据,将其cag_name修改之后,再此更新表中这条数据。save方法会自动判断是更新还是插入新数据。
3. 查询数据
# 引入NewsList和NewsCategory类from News.models import NewsCategory, NewsListimport datetime# 1. 获得所有数据news = NewsList.objects.all()# 2. 获得某条数据news = NewsList.objects.get(pk=1)
news = NewsList.objects.all()
这句表示获取NewsList表中所有的数据。get可以根据某个字段值获取一条数据。
4. 删除数据
django中默认删除数据(默认SQL ON DELETE CASCADE,级联删除,删除分类,分类下的所有新闻也会被删除.): 比如我们的NewsInfo类foreignkey是NewsCategory, 当删除一个分类,那么与这个分类相关的的新闻信息中的数据也会被删除。
# 引入NewsList和NewsCategory类from News.models import NewsCategory, NewsListimport datetime# 1. 获得某条数据news = NewsList.objects.get(pk=1)# 2. 删除本条数据news.delete()
django中提供了关联的操作方式,获得关联集合:返回当前NewsCategory对象的所有NewsList):
我们删除了一个分类信息。通过调用delete方法,那么与此分类关联的NewInfo对象会被全部删除。
- django基础入门(3)-设计模型
- Django 轮播图模型设计
- 3.Django入门:教程-模型
- Django 课程页面模型设计
- django基础入门(1)django基本配置
- django基础入门(5)-视图
- django基础入门(6)-模板
- django模型3
- Django入门-5:模型的基本使用3-模型成员&创建对象
- Crushe Django 入门笔记4 使用模型
- Django入门:多对一模型
- Django入门:多对多模型
- 软件模型设计基础
- 软件模型设计基础
- 软件模型设计基础
- Django模型设计详解系列之三
- Django 设计邮箱验证码模型
- Django学习笔记3 Django模型
- Vue全家桶实现一个购物Web App
- ASP.NET MVC 无法在Web 服务器上启动调试.远程服务器返回错误:(400)错误的请求
- 48.Scala类型约束代码实战及其在Spark中的应用源码解析
- 解决SSH项目中Action跳转之后,页面样式、图片丢失的问题
- Control character in cookie value, consider BASE64 encoding your value
- django基础入门(3)-设计模型
- 2017-9-25
- 华为交换机基本视图
- 泛型之列表的创建和使用
- html笔记——可预约当日的select制作
- hdu 3308(线段树区间合并)
- java compiler level does not match the version of the installed java project facet错误的解决
- KMP算法的部分匹配值的计算
- Cg Programming/Unity/Order-Independent Transparency