一、DjangoORM 创建基本类型及生成数据库表结构

1、简介

  ORM:关系对象映射。定义一个类自动生成数据库的表结构。

  数据库常用的数据类型 :

    1. 数字
    2. 字符串
    3. 时间

ORM分为两种类型: 主流都是code first

    • code first:先写代码,执行代码创建数据库表结构
    • DB    first:据库里先创建数据库表结构,根据表结构生成类,根据类操作数据库

  Django也是code first。其本质:

    1. 根据类自动创建数据库表

      2.根据类对数据库中的表进行各种操作

2、创建数据库 表结构

  2.1 先写类

 from django.db import models

 class UserInfo(models.Model):  # 必须继承models.Model
# 不写则,django默认创建ID列,自增,主键
# 用户名列,字符串类型,指定长度
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)

  2.2 注册app

    

   执行命令python manage.py makemigrations,会提示No changes detected

      这是因为:执行命令时会找所有models,但是django不知道找哪个,所有需要指定一下。

    在配置文件setting中

 INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01', # 这里添加app
]

  2.3执行命令生成表结构

1 python manage.py  makemigrations    # 生成migrations临时文件
2 python manage.py migrate # 根据migrations直接生成数据库

  执行后,从migrations便会产生操作记录。生成数据库,默认情况下用的sqlite3。可以用navicat等软件直接打开。

  db.sqlite3里面包含缓存、session、cookie、静态文件以及后台管理。像咱们创建的表名叫:app01_userinfo

  2.4、连接mysql数据库

    Django默认使用的是sqllite,如果想使用mysql数据库。代码不用改、命令也不用改,只需要改下配置文件。

# https://docs.djangoproject.com/en/1.10/ref/settings/#databases  官网文档
# DATABASES = { # sqlite 默认
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
DATABASES = { # mysql
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'mydatabase',
'USER': 'mydatabaseuser',
'PASSWORD': 'mypassword',
'HOST': '127.0.0.1',
'PORT': '',
}
}

注意:

  1.Django在使用mysql的时候,不能帮我们创建数据库,所以我们要自己去创建

  2.Django默认使用MySQLdb模块链接MySQL,但是在py3中还没有MySql模块,所以我们要使用PyMysql。

    在project项目名下的__init__.py里面

 import pymysql
pymysql.install_as_MySQLdb()

二、Django ORM基本的增删改查

 from cmdb import models #先到app中把models导入,下面可使用我们的类
def orm(request):
*****创建的三种方法,推荐使用第一种
# models.User_info.objects.create(username='aelex',password='123') # dic = {'username':'lh','password':'231'}
# models.User_info.objects.create(**dic) # obj = models.User_info(username='aelex',password='231')
# obj.save()
***********基本的查数据:得到的数据是一个对象结合
#v=models.User_info.objects.all()      #得到的是QuerySet对象,并且有多个元素,类似列表,可以进行for循环
#v = models.User_info.objects.filter(id=1) #filter 相当于 sql中的where
# v = models.User_info.objects.filter(username='lh', password='231')# 使用,拼接and的作用
# for row in v:
# print(row.id, row.username, row.password) #每个元素都是我们在定义数据库的时候的值
*******************删除操作
# models.User_info.objects.filter(id=1).delete() #先得到对象,在使用dellete方法删除
******************更新操作
models.User_info.objects.all().update(password='')
return render(request, 'orm.html')

多对多关系

方式1:手动创建

 class host(models.Model):
#db_index 是创建索引,加快搜索
id = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=,db_index=True)
ip = models.GenericIPAddressField(db_index=True,protocol='both')
port = models.IntegerField()
b = models.ForeignKey('Busniess',to_field='id')
#b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id
#视图函数中操作b是一个链表操作。 class Application(models.Model):
name = models.CharField(max_length=) class HostToApp(models.Model):
15 hobj = models.ForeignKey(to="host", to_field="id")
16 aobj = models.ForeignKey(to="Application",to_field="id")

方式2:系统自动创建

创建了一张新表,自动关联两者的主键。

 class host(models.Model):
#db_index 是创建索引,加快搜索
id = models.AutoField(primary_key=True)
hostname = models.CharField(max_length=,db_index=True)
ip = models.GenericIPAddressField(db_index=True,protocol='both')
port = models.IntegerField()
b = models.ForeignKey('Busniess',to_field='id')
#b是一个对象,封装了另外一种表的一整行数据,这个表中并不存在b,只存在b_id
#视图函数中操作b是一个链表操作。 class Application(models.Model):
name = models.CharField(max_length=)
r = models.ManyToManyField(to="host")

手动创建:可以自定义列,使用类操作数据库来使用。

自动创建:只能创建三列(id,两张表的主键)。看不到这个类,所以无法直接对表进行操作。

      间接操作:

       obj=models.Application.obj.get(id=) #得到一列,里面有name与r(是一个对象)

       obj.r.add(1)

       obj.r.add(1,2,3)

       obj.r.add(*[1,2,3])

       obj.r.remove()   存在上面三种方式

       obj.r.clear()    情况所有的对应

       obj.r.set(,,)  类似重置的功能,删除所有的对应,新建1- - -

Django(三) ORM操作的更多相关文章

  1. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  2. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  3. django的orm操作优化

    django的orm操作优化 models.py from django.db import models class Author(models.Model): name = models.Char ...

  4. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  5. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  6. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  7. Django中ORM操作

    ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...

  8. Django的ORM操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  9. Django之ORM操作总结

    Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...

随机推荐

  1. 洛谷 P1308 统计单词数【字符串+模拟】

    P1308 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数. 现在,请你编程实现这一功能,具体要求是:给定 ...

  2. x+y=xy

        有一天,我拿这一本本子给两位同学看,问他们这本本子多少钱,一个说3块,一个说1.5块,但它实际上是4.5块.于是,我们发现,3X1.5=4.5,3+1.5=4.5.那么这样的数有哪些呢?    ...

  3. A Bug's Life(种类并查集)(也是可以用dfs做)

    http://acm.hdu.edu.cn/showproblem.php?pid=1829   A Bug's Life Time Limit:5000MS     Memory Limit:327 ...

  4. DFS+打表

    N皇后问题 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status ...

  5. 电脑打不开网页,使用dns优化下就可以了。

    通过电脑管家dns优化下就可以了.启用114DNS

  6. python 元组学习

    元组用tuple表示,用,分割开,和列表类似,但是没有排序修改等高级操作.简单地说就是终态的...... >>> tuple1 = (1,2,3)>>> type( ...

  7. linux 下CentOS 下 npm命令安装gitbook失败的问题

    运行环境 linux 服务器:CentOS 7.0 系统:安装了nodejs :使用 npm 安装 gitbook 出现错误提示: npm install -g gitbook-cli symbol ...

  8. 我的第一个python web开发框架(20)——产品发布(部署到服务器)

    首先按上一章节所讲述的,将服务器环境安装好以后,接下来就是按步骤将网站部署到服务器上了. 我们的站点是前后端分离的,所以需要部署两个站点.首先来发布前端站点. 部署前端站点 输入命令进入svn管理文件 ...

  9. 将项目(代码)从GitHub上克隆(下载)到本地仓库

    要将项目从GitHub上克隆到本地,首先你得下载并安装好git for window. 下载地址:http://www.xp510.com/xiazai/Application/other/30988 ...

  10. DEDECMS系统安全篇之移data目录到Web根目录以外听语音

    http://jingyan.baidu.com/article/ad310e80aeb0971849f49e8e.html 主要三个步骤: 1./include/common.inc.php 2.还 ...