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. 迁移

迁移就是我们执行一个命令,让django根据我们在model.py模块中定义的模型类,来生成sql语句。django默认使用的sqlite数据库,我们先暂时使用这个数据库。
执行迁移分为两步:

1. 生成迁移文件:根据模型类生成创建表的语句;

2. 执行迁移文件:根据第一步生成的语句在数据库中创建表;
执行迁移前我的项目目录:

现在我们首先执行生成迁移文件的命令:
python manage.py makemigrations

成功执行迁移命令之后,项目目录结构为:

在应用的news_app目录下的migrations目录下多出一个0001_initial.py文件,这就是我们的迁移文件。我们执行这个迁移文件,django就会在我们默认的sqlite数据库中创建model.py中定义的数据表。

下面我们来执行迁移文件命令:

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对象会被全部删除。