声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用

上篇我们完成了数据库模型的代码,但是还只是python代码而已,我们还没有让django翻译成数据库语言。因此实际上这些table还没有创建

为了让django完成翻译,还需要使用manage.py。进入Terminal运行python manage.py makemigrations 和 python manage.py migrate

可以看到,当我们执行了python manage.py makemigrations 后,django在blog应用的migrations目录下生成了一个0001.initial.py文件,这个文件是django用来记录我们对模型做了那些修改的文件,目前来说,我们在models.py里面建了三个模型类,django把这些变化记录在了0001.initial.py里,但此时只是告诉了django我们做了那些改变,为了让django真正为我们创建数据库表,接下来执行了python manage.py migrate命令,django通过检测应用中migrations目录下的文件,得知我们对数据库做了那些操作,然后把这些操作翻译成数据库语言,从而把这些操作应用于真正的数据库里,你可以看到命令的输出除了Applying blog 0001.initial...OK外,django还对其它文件做了操作,这是因为除了我们自己建立的blog应用外,django自己还内置了很多应用,这些引用自己也是需要数据的,可以再settings.py的INSTALLED_APP设置里看到这些应用

 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'blog',
]

你可以运行下面的命令查看django究竟为我们做了什么:python manage.py sqlmigrate blog 0001

这些数据库的SQL语言

使用django的方式从数据库里获取数据

数据库最主要的操作就是往里面存入数据,从中取出数据,修改已经保存的数据和删除不再需要的

数据,和创建数据库表一样django为这些操作提供了一整套方法,只要简单的调用几个python函数就可以满足我们的需求

在Terminal运行python manage.py shell进入一个交互式命令行

首先创建一个分类和一个标签

 from blog.models import Category, Post, Tag
c = Category(name='category test')
c.save()
t = Tag(name='tag test')
t.save()

首先导入了3个我们之前写好的模型类,然后实例化了一个Category类和一个Tag类,为他们的属性name赋值,为了让django帮我们把这些数据保存数据库,调用实例的save()方法即可。

再创建一篇文章,但创建一篇文章之前,我们需要创建一个User,用于指定文章的作者,创建User的命令django帮我们写好了,依然是通过manage.py来运行,首先退出shell,运行以下命令并根据提示创建用户:

注意密码输入的时候看不到的

再次进入python命令行,开始创建文章

from blog.models import Category, Tag, Post
from django.utils import timezone
from django.contrib.auth.models import User user = User.objects.get(username='djc')
c = Category.objects.get(name='category test')
p = Post(title='title test', body='body test', created_time=timezone.now(), modified_time=timezone.now(), category=c, author=user)
p.save()

由于我们重启了shell,所以重新导入了Category, Tag, Post,以及User,我们还导入了一个timezone,这是因为我们需要调用它的now()方法为created_time和modified_time提供时间,然后我们根据用户名和分类名,通过get方法取出了数据库中的User和Category,此外还指定了title,body的值,并把它和前面创建的Category c关联了起来,只有允许为空excerpt,tags没有指定值

数据已经存入数据库了,现在把它取出来看看

>>> Category.objects.all()
<QuerySet [<Category: Category object>]>
>>> Tag.objects.all()
<QuerySet [<Tag: Tag object>]>
>>> Post.objects.all()
<QuerySet [<Post: Post object>]>
>>>

objects 是我们的模型管理器,它为我们提供一系列从数据库中取数据方法,这里我们使用了 all() 方法,表示我们要把对应的数据全部取出来。可以看到 all() 方法都返回了数据,这些数据应该是我们之前存进去的,但是显示的字符串显示是一个Category object,。为了让显示出来的数据更加友好,我们分别为三个模型增加一个 __str__() 方法:

定义好 __str__() 方法后,解释器显示的内容将会是由 __str__() 方法返回的内容,这里 Category 返回分类名 name,Tag 返回标签名,而 Post 返回它的 title。

>>> from blog.models import Category, Tag, Post
>>> Category.objects.all()
<QuerySet [<Category: category test>]> >>> Tag.objects.all()
<QuerySet [<Tag: tag test>]> >>> Post.objects.all()
<QuerySet [<Post: title test>]>

以看到返回的是我们之前存入的数据。此外我们在创建文章时提到了通过 get 方法来获取数据,这里 all 方法和 get 方法的区别是,all 返回全部数据,是一个列表,而 get 返回一条记录数据

尝试修改数据:

>>> c = Category.objects.get(name='category test')
>>> c.name = 'category test new'
>>> c.save()
>>> Category.objects.all()
<QuerySet [<Category: test category new>]>

首先通过 get 方法根据分类名 name 获取到分类,修改它的 name 属性为新的值 category test new,然后调用 save 方法把修改保存到数据库,之后可以看到数据库返回的数据已经是修改后的值了。Tag、Post 的修改也一样。

删除掉数据:

>>> p = Post.objects.get(title='title test')
>>> p
<Post: title test>
>>> p.delete()
(1, {'blog.Post_tags': 0, 'blog.Post': 1})
>>> Post.objects.all()
<QuerySet []>

先根据标题 title 从数据库中取出 Post,保存在变量 p 中,然后调用它的 delete 方法,最后看到 Post.objects.all() 返回了一个空的 QuerySet(类似于一个列表),表明数据库中没有 Post,Post 已经被删除了。

这就是 django 对数据库增、删、改、查的操作。除了上述演示的方法外,django 还为我们提供了大量其它的方法,这些方法有一部分会在教程中使用,用到时我会讲解它们的用法。但以后你开发自己的项目时,你就需要通过阅读django官方文档来了解有哪些方法已经如何使用它们。

让django完成翻译,迁移数据库模型的更多相关文章

  1. django博客项目3:创建 Django 博客的数据库模型

    设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库.我们把写好的文章永久地保存在数据库里,当用户访问我们的博客 ...

  2. linux 下一个 jira-6.3.6 组态 皴 翻译 迁移数据库

    每一个版本号翻译包下载  https://translations.atlassian.com/dashboard/download jira下载地址  https://www.atlassian.c ...

  3. django中sqlite迁移mysql

    sqlite数据迁移 1 数据备份 django中打开terminalpython manage.py dumpdata authorization > authorization_data.j ...

  4. Django字符串翻译

    文章出处:https://www.jb51.net/article/70077.htm Django模板使用两种模板标签,且语法格式与Python代码有些许不同. 为了使得模板访问到标签,需要将 {% ...

  5. 解决Django项目数据库无法迁移问题

    找到自己的虚拟环境,以下是我自己的环境路径 D:\xunihuanjing\venv\Lib\site-packages\django\contrib\admin\migrations 然后删除里面的 ...

  6. 【Django】数据迁移问题

    最近发现,Django在修改models之后重新生成迁移文件(这里可以生成),再进行数据库迁移的时候老是出错,查询数据库时老是找不到表格或者字段. 尝试过重新新建项目,新建一个同名APP,然后mode ...

  7. 【Python】Django删除数据迁移记录

    find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec ...

  8. django使用migrations迁移版本和数据库中报错解决方案

    1.到数据库表django_migrations中查看app中看看app列 2.到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样 3.找到哪里不一致的文 ...

  9. 创建Django博客的数据库模型

    声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 blog最主要的功能就是展示我们写的文章 ...

随机推荐

  1. mysql 升序 字段值为NULL 排在后面

    select * from yryz_products_t order by isnull(sort),sort;

  2. eclipse中文件文件夹高速定位,打开文件所在文件夹,在资源管理器中查看

    viewFile.bat (打开选中的文件获取目录) Explorer/e,/select,%1 viewjava.bat (打开选中的文件名称相应的.java文件) @echo off set ca ...

  3. vue2.0 仿手机新闻站(三)通过 vuex 进行状态管理

    1.创建 store 结构 2.main.js  引入 vuex 3. App.vue  组件使用 vuex <template> <div id="app"&g ...

  4. 【Python】存储数据

    很多程序都要求用户输入某种信息,如让用户存储游戏首选项或者提供可视化数据,不管专注什么,程序都要将数据进行存储,那么如何存储呢? JSON(JavaScript Object Notation)格式最 ...

  5. 为电脑添加u盘写保护

    需求:解决在公共打印PC机上u盘病毒的传染,设置后该PC机将不能对u盘文件进行写操作 修改注册表,在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Contro ...

  6. iOS 一些struct类型的NSLog输出

    我们经常会输出一些坐标尺寸信息之类的,比如view的frame,是CGRect类型的,用frame.oringial.x 和frame.size.width来做NSLog参数好麻烦,还好苹果对这些常用 ...

  7. solr入门之pinyin4j源代码改写动态加入扩展词及整合进war项目中

    1.初始化时载入用户定义的字典 package net.sourceforge.pinyin4j; import net.sourceforge.pinyin4j.multipinyin.Trie; ...

  8. DNA分子结构3D模型

    生物信息资源更新越来越快,使用可视化的方法来分析DNA序列已成为生物信息学的一个研究热点,用图形表示DNA序列的方法也越来越成熟.2011年,著名杂志<Science>发表一篇引起轰动的文 ...

  9. 移动app性能测试(待完善)

    移动终端性能测试是测试手机终端是否符合特定性能指标的测试,包括有:内存.CPU.电量.流量.流畅度.时延等 测试准备:测试账号.测试需求.测试用例.待测手机.待测应用包.测试工具.测试电脑 1.  时 ...

  10. PHP和mysql的长连接

    关于 PHP MySQL 长连接.连接池的一些探索 PHP连接MySQL的方式,用的多的是mysql扩展.mysqli扩展.pdo_mysql扩展,是官方提供的.php的运行机制是页面执行完会释放所有 ...