声明:此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. SVN切分支步骤

    1.右键project选择Brankch/Tag 2.选择SVN路径并在改路径下填写project名称 3.选择最新版本号 4.填写必要的凝视备忘,方便日后查看 5.刷新父文件夹文件夹.下载被切出来的 ...

  2. 处理中文空格.replace((char)12288,' ')

    trim()只能替换英文空格.replace((char)12288,' ')是替换中文

  3. gray-code——找规律

    The gray code is a binary numeral system where two successive values differ in only one bit. Given a ...

  4. swoole新手教程01-环境搭建及扩展安装

    写在前面的废话 <swoole源代码分析>已经写了13章,整个swoole的核心架构基本都分析的差点儿相同了.于是心里一直以来想整理swoole的文档并写一份教程的想法就再度浮了出来. 实 ...

  5. Dell 刀片服务器CentOS6.5mini开机20~30分钟宕机

    今天查看系统日志发现大量的nf_conntrack: table full, dropping packet. 错误 cat /var/log/messages | moreJun  7 09:52: ...

  6. 非标准USBasp下载线烧录Arduino BootLoader的参数设置

    本文仅适用于BootLoader损坏且买到国产“免驱USBasp下载线”导致Arduino IDE无法识别从而不能烧写的情况.是一种略显非主流的操作方式. 因为Arduino的IDE并不支持这种免驱的 ...

  7. python学习(十)赋值、表达式、if、while、for

    明天以搞定这几个应该不难 赋值.表达式.if.while.for 函数.作用域.参数.函数高级话题 迭代和解析一.二 还有我的<30天自制操作系统>没看 #!/usr/bin/python ...

  8. 分布式服务框架 Zookeeper(一)介绍

    一.概述 ZooKeeper(动物园管理员),顾名思义,是用来管理Hadoop(大象).Hive(蜜蜂).Pig(小猪)的管理员,同时Apache Hbase.Apache Solr.LinkedIn ...

  9. Jquery系列问题

    jquery汇总系列: 0.jquery 基础教程[温故而知新二] Jquery常见问题汇总 1.eval  解析  JSON  中的注意点 2.Jquery 中的 this 与 $(this) .J ...

  10. 禁用android studio自身的ndk编译disable automatic ndk-build call

    1,让studio不自动编译jni文件,而是我们手动通过ndk-build编译    打开工程下面的app文件夹, 找到build.gradle   添加如下:  defaultConfig {   ...