声明:此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. Testin云測手游质量管家 七大兵器助CP称霸江湖

    Testin云測手游质量管家 七大兵器助CP称霸江湖 2014/09/29 · Testin · 产品评測 在武侠江湖里,高手不须要武功高强.亦要具备厉害的武器.有人的地方就有江湖.手游行业相同腥风血 ...

  2. mysql中UNIX_TIMESTAMP()函数和php中time()函数的区别

    http://tech.ddvip.com/2009-01/1231392775105351.html mysql 中:UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date) 若 ...

  3. iOS之手势滑动返回功能

    iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的 ...

  4. php的strip_tags,htmlspecialchars,htmlentities,stripslashes,addslashes解释

    php函数蛮多的,要完整的每个函数都理解深刻是个挺有挑战性的事情. strip_tags,htmlspecialchars,htmlentities,stripslashes,addslashes这几 ...

  5. openssl生成https证书

    openssl生成https证书 分类: 其它2009-09-03 16:20 452人阅读 评论(0) 收藏 举报 includemoduleaccessapachessl服务器 openssl生成 ...

  6. HP Vertica Analytics Platform 评測

    1.vertica概念 面向数据分析的数据仓库系统解决方式 2.vertica关键特性 Ø  标准的SQL接口:能够利用已有的BI.ETL.Hadoop/MapReduce和OLTP环境 Ø  高可用 ...

  7. typeof 与 instanceof 区别

    typeof typeof 是一元运算符,返回值是字符串,且只能是number,string,boolean,object,function,undefined typeof用来判断一个值是否存在 i ...

  8. 2_Jsp标签_传统标签功能简介

    1传统标签接口关系:                                   2功能简介                                                   ...

  9. ViewPager总结

    https://github.com/youth5201314/banner compile 'com.youth.banner:banner:1.4.9' private void setBanne ...

  10. iPhone,iPad如何获取WIFI名称即SSID

    本文转载至 http://blog.csdn.net/wbw1985/article/details/20530281  2010年开始苹果清理了一批APP Store上的WIFI扫描软件, 缘由语焉 ...