让django完成翻译,迁移数据库模型
声明:此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完成翻译,迁移数据库模型的更多相关文章
- django博客项目3:创建 Django 博客的数据库模型
设计博客的数据库表结构 博客最主要的功能就是展示我们写的文章,它需要从某个地方获取博客文章数据才能把文章展示出来,通常来说这个地方就是数据库.我们把写好的文章永久地保存在数据库里,当用户访问我们的博客 ...
- linux 下一个 jira-6.3.6 组态 皴 翻译 迁移数据库
每一个版本号翻译包下载 https://translations.atlassian.com/dashboard/download jira下载地址 https://www.atlassian.c ...
- django中sqlite迁移mysql
sqlite数据迁移 1 数据备份 django中打开terminalpython manage.py dumpdata authorization > authorization_data.j ...
- Django字符串翻译
文章出处:https://www.jb51.net/article/70077.htm Django模板使用两种模板标签,且语法格式与Python代码有些许不同. 为了使得模板访问到标签,需要将 {% ...
- 解决Django项目数据库无法迁移问题
找到自己的虚拟环境,以下是我自己的环境路径 D:\xunihuanjing\venv\Lib\site-packages\django\contrib\admin\migrations 然后删除里面的 ...
- 【Django】数据迁移问题
最近发现,Django在修改models之后重新生成迁移文件(这里可以生成),再进行数据库迁移的时候老是出错,查询数据库时老是找不到表格或者字段. 尝试过重新新建项目,新建一个同名APP,然后mode ...
- 【Python】Django删除数据迁移记录
find . -path "*migrations*" -name "*.py" -not -path "*__init__*" -exec ...
- django使用migrations迁移版本和数据库中报错解决方案
1.到数据库表django_migrations中查看app中看看app列 2.到项目对应的app模块中打开migrations文件查看生成的文件与数据库app列中的是不是一样 3.找到哪里不一致的文 ...
- 创建Django博客的数据库模型
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 blog最主要的功能就是展示我们写的文章 ...
随机推荐
- ASP.NET MVC深入浅出系列(持续更新) ORM系列之Entity FrameWork详解(持续更新) 第十六节:语法总结(3)(C#6.0和C#7.0新语法) 第三节:深度剖析各类数据结构(Array、List、Queue、Stack)及线程安全问题和yeild关键字 各种通讯连接方式 设计模式篇 第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借
ASP.NET MVC深入浅出系列(持续更新) 一. ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态模 ...
- OpenGL研究3.0 多边形区域填充
OpenGL研究3.0 多边形区域填充 DionysosLai(906391500@qq.com)2014-06-22 所谓多边形区域填充.就是将多边形内部区域,所有已相同色块填充.注意:这里讨论的多 ...
- IDEA------Error:java:无效的目标发行版:1/7
© 版权声明:本文为博主原创文章,转载请注明出处 使用IDEA发布java web项目时,报错.报错信息如下: 解决方案: 方案一:File-->Settings-->Build,Exec ...
- 应对ie双外边距,不使用hack
1.在浮动元素内层加一层div 2.使用不浮动的内层外边距来定义距离 ie在浮动时,并且使用外边距,会产生双倍外边距.
- Chrome自带恐龙小游戏的源码研究(七)
在上一篇<Chrome自带恐龙小游戏的源码研究(六)>中研究了恐龙的跳跃过程,这一篇研究恐龙与障碍物之间的碰撞检测. 碰撞盒子 游戏中采用的是矩形(非旋转矩形)碰撞.这类碰撞优点是计算比较 ...
- 【Java】Spring Web MVC注意事项
本文内容可能是书上没有的,至少是<Java Web整合开发实践>这本书上没有的.这是初学Spring的笔者走过的弯路,谨记以自勉. 这两天学习Spring WebMVC,照着书依葫芦画瓢写 ...
- python学习(七)字典学习
#!/usr/bin/python # 字典 # 当时学java的时候, 语言基础就学了好久, 然后是各种API, 最后才是集合 # 键值对, 可变 # 1. 映射操作 D = {'food' : ' ...
- HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程
在<HDFS源码分析心跳汇报之数据结构初始化>一文中,我们了解到HDFS心跳相关的BlockPoolManager.BPOfferService.BPServiceActor三者之间的关系 ...
- HDFS源码分析心跳汇报之数据块增量汇报
在<HDFS源码分析心跳汇报之BPServiceActor工作线程运行流程>一文中,我们详细了解了数据节点DataNode周期性发送心跳给名字节点NameNode的BPServiceAct ...
- 给js对象赋值,赋值key
var pastResult = []; pastResult.push(feature.attributes.F_iID); pastResult.push(feature.attributes.F ...