作者:刘耀

一、Django-orm

关系对象映射(Object Relational Mapping,简称ORM)。

2.在django里

我们写的类表示数据库的表

如果根据这个类创建的对象是数据库表里的一行数据

对象.id 对象.value 是每一行里的数据

二、常用字段

1.首先创建一个工程和app

2在app名字是orm的下面model.py下面

from django.db import models

# Create your models here.
class UserProfile(models.Model):
name = models.CharField(max_length=64,)
age = models.IntegerField()
job = models.CharField(max_length=128,)
addr = models.CharField(max_length=256,)

1.userprofile是表名

2.name age job 等是整个表结构

3.常用字段

1、models.AutoField  自增列 = int(11)
  如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列设置为主键 primary_key=True。
2、models.CharField  字符串字段
  必须 max_length 参数
3、models.BooleanField  布尔类型=tinyint(1)
  不能为空,Blank=True
4、models.ComaSeparatedIntegerField  用逗号分割的数字=varchar
  继承CharField,所以必须 max_lenght 参数
5、models.DateField  日期类型 date
  对于参数,auto_now = True 则每次更新都会更新这个时间;auto_now_add 则只是第一次创建添加,之后的更新不再改变。
6、models.DateTimeField  日期类型 datetime
  同DateField的参数
7、models.Decimal  十进制小数类型 = decimal
  必须指定整数位max_digits和小数位decimal_places
8、models.EmailField  字符串类型(正则表达式邮箱) =varchar
  对字符串进行正则表达式
9、models.FloatField  浮点类型 = double
10、models.IntegerField  整形
11、models.BigIntegerField  长整形
  integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
12、models.IPAddressField  字符串类型(ip4正则表达式)
13、models.GenericIPAddressField  字符串类型(ip4和ip6是可选的)
  参数protocol可以是:both、ipv4、ipv6
  验证时,会根据设置报错
14、models.NullBooleanField  允许为空的布尔类型
15、models.PositiveIntegerFiel  正Integer
16、models.PositiveSmallIntegerField  正smallInteger
17、models.SlugField  减号、下划线、字母、数字
18、models.SmallIntegerField  数字
  数据库中的字段有:tinyint、smallint、int、bigint
19、models.TextField  字符串=longtext
20、models.TimeField  时间 HH:MM[:ss[.uuuuuu]]
21、models.URLField  字符串,地址正则表达式
22、models.BinaryField  二进制
23、models.ImageField 图片
24、models.FilePathField 文件

4.图片和文件上传

models.ImageField这个方法继承的就是models.FilePathField这个方法

表结构:

class  UserProfile(models.Model):
name = models.CharField(max_length=64,)
age = models.IntegerField()
job = models.CharField(max_length=128,)
addr = models.CharField(max_length=256,)
reg = models.DateField(auto_now=True)
login = models.DateField(auto_now_add=True)
head_img = models.ImageField(blank=True,null=True,upload_to="static")

这样在后台就可以上传了。路径为static

#null=True,表示数据库存储的时候可以为空,blank=True表示在admin后台提交的时候可以为空!
#upload_to='user_upload' 用户提交的数据保存到哪里 他把这个文件或者图片上传到指定目录之后 会把这个图片的路径或文件保存到数据库中
并不是把文件也保存到数据库中

5.默认返回值

把这个添加到表结构的最后面

3.5是这样的

def __str__(self):
return self.name

这样之后默认显示的就是这个表的名字 在后台admin里

2.7是这样的

def __str__(self):
return self.name

6.表结构后面的特殊参数

1、null=True
  数据库中字段是否可以为空
2、blank=True
  django的 Admin 中添加数据时是否可允许空值
#一般null=True & blank=True 咱们搭配着用,出现null=True就用上blank=True
3、primary_key = True
  主键,对AutoField设置主键后,就会代替原来的自增 id 列
4、auto_now 和 auto_now_add
  auto_now 自动创建---无论添加或修改,都是当前操作的时间
  auto_now_add 自动创建---永远是创建时的时间
5、choices (后台admin下拉菜单)
USER_TYPE_LIST = (
(1,u'超级用户'),
(2,u'普通用户'),
)
user_type = models.IntegerField(choices=USER_TYPE_LIST,default=1,verbose_name=u'用户类型')
6、max_length 最大长度
7、default  默认值
8、verbose_name  Admin(后台显示的名称)中字段的显示名称
9、name|db_column  数据库中的字段名称
10、unique=True  不允许重复
11、db_index = True  数据库索引,例如:如果你想通过name查询的更快的话,给他设置为索引即可
12、editable=True  在Admin里是否可编辑
13、error_messages=None  错误提示
14、help_text  在Admin中提示帮助信息
15、validators=[]
16、upload-to

8.前端文件上传实例

1.前端页面

	<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="" enctype="multipart/form-data" method="post">{% csrf_token %}
<input name="file" id="file" type="file"/>
<input type="submit" value="提交"/>
</form>
</body>
</html>

2.后端函数

from django.shortcuts import render

# Create your views here.
def index(request):
#打印要上传图片的文件名
file_obj = request.FILES.get('file')
f = open(file_obj.name,'wb')
for line in file_obj.chunks():
f.write(line)
f.close()
return render(request,'index.html')

3.图片默认上传到你工程的目录下

9.model链表操作

一对多:models.ForeignKey(其他表)
多对多:models.ManyToManyField(其他表)
一对一:models.OneToOneField(其他表)

1.一对多

一对多的意思就是例如一个注册的时候 选择男或者女

from django.db import models

# Create your models here.
#用户表结构
class UserProfile(models.Model):
name = models.CharField(max_length=64,)
#关联性别的表
sex = models.ForeignKey('Sex')
age = models.IntegerField()
job = models.CharField(max_length=128,)
addr = models.CharField(max_length=256,)
reg = models.DateField(auto_now=True)
login = models.DateField(auto_now_add=True)
head_img = models.ImageField(blank=True,null=True,upload_to="static") def __str__(self):
return self.name
#性别表结构
class Sex(models.Model):
name = models.CharField(max_length=64) def __str__(self):
return self.name

从admin里创建男和女两个

当我创建用户的时候 就会这样

2.多对多

多对多的意思就是用户注册的时候 可以选择多个爱好

class  UserProfile(models.Model):
name = models.CharField(max_length=64,)
sex = models.ForeignKey('Sex')
#加入爱好选择
hobby = models.ManyToManyField('Hobby')
age = models.IntegerField()
job = models.CharField(max_length=128,)
addr = models.CharField(max_length=256,)
reg = models.DateField(auto_now=True)
login = models.DateField(auto_now_add=True)
head_img = models.ImageField(blank=True,null=True,upload_to="static")
def __str__(self):
return self.name
class Sex(models.Model):
name = models.CharField(max_length=64)
def __str__(self):
return self.name
#爱好表结构
class Hobby(models.Model):
name = models.CharField(max_length=63)
def __str__(self):
return self.name

在admin里注册

from orm import models

admin.site.register(models.UserProfile)

admin.site.register(models.Sex)

admin.site.register(models.Hobby)

在后台里添加多个爱好

当我创建用户的时候

3.一对一

就是说我有个管理员用户 之后我又新建了一个用户 这个用户继承了管理员用户,继承之后 这个管理员就不能被其他用户继承了。

在model表里创建
#登录表
class Userlogin(models.Model):
#关联注册的用户
user = models.OneToOneField('UserProfile')
passwd = models.CharField(max_length=128)
def __str__(self):
return self.user.name 在admin里注册 admin.site.register(models.Userlogin)

当我注册了一个可以登录的用户

继承注册的用户

等我在注册是时候,选择刘耀的时候 提示已经存在了、

10.model的增删改查

1.增加

models.UserProfile.objects.create(字段具体内容)

#先创建对象
obj= models.UserProfile.objects.create()
#之后在保存
obj.save() #先把字段放进到字典里
dic = {'name':'1',省略}
models.UserProfile.objects.create(**dic)

2.删除

删除的时候就是把查到的字段后面加上.delete()
#先查询 之后查询到之后删除 models.UserProfile.objects.all().delete()
models.UserProfile.objects.filter(name='刘耀').delete()
models.UserProfile.objects.all().values('age').delete()
models.UserProfile.objects.all().values_list('age').delete()

3.修改

1.第一种修改是先查询到后.update()

#获取所有
models.UserProfile.objects.filter(name='刘耀').update(age=20)
#获取指定列的所有值
models.UserProfile.objects.all().values('age').update(name='我曹')

2.先创建对象之后修改

obj = models.UserProfile.objects.get(name='刘耀')
obj.age = 12
obj.save()

4.查询

#获取所有
models.UserProfile.objects.all() models.UserProfile.objects.get('刘耀') #如果不存在那么会报错
#过滤查询
models.UserProfile.objects.filter(name='刘耀')
#获取指定列的所有值
models.UserProfile.objects.all().values('age')
#获取
models.UserProfile.objects.all().values_list('age')

更多操作

获取某个值的总数

models.UserProfile.objects.filter(age='18').count()

大于,小于

#获取id大于1的值
models.UserProfile.objects.filter(id__gt=1)
#获取id小于10的值
models.UserProfile.objects.filter(id__lt=10)
#获取id大于1 且 小于10的值
models.UserProfile.objects.filter(id__lt=10, id__gt=1)

某个值等于多个值其中的一个

#in
#获取id等于11、22、33的数据
models.UserProfile.objects.filter(id__in=[11, 22, 33])
#获取id不等于11,22,33的数据
models.UserProfile.objects.exclude(id__in=[11, 22, 33])

contains

models.UserProfile.objects.filter(name__contains="刘")
models.UserProfile.objects.filter(name__icontains="耀") # icontains大小写不敏感
#非
models.UserProfile.objects.exclude(name__icontains="耀")

匹配范围内的

range

models.UserProfile.objects.filter(id__range=[1, 3]) # 范围bettwen and

其他匹配

startswith,
istartswith,
endswith,
iendswith,

排序查找

order by
models.UserProfile.objects.filter(name='刘耀').order_by('id') # asc正序
models.UserProfile.objects.filter(name='刘耀').order_by('-id') # desc反序

分页时

#取所有数据的2条到5条,分页的时候用的到
models.UserProfile.UserProfile.all()[2:5]
models.UserProfile.UserProfile.all()[2:5]

6.django笔记之orm的更多相关文章

  1. Django学习笔记之ORM字段和字段参数

    Object Relational Mapping(ORM) 一.ORM介绍 1. ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象 ...

  2. Web框架——Django笔记

    Web框架--Django笔记 MVC和MTV MVC:Model.View.Controller MTV:Model.Template.View Django--MTV 1.创建Django程序   ...

  3. Django中的ORM进阶操作

    Django中的ORM进阶操作 Django中是通过ORM来操作数据库的,通过ORM可以很easy的实现与数据库的交互.但是仍然有几种操作是非常绕也特别容易混淆的.于是,针对这一块,来一个分类总结吧. ...

  4. Python/Django(CBV/FBV/ORM操作)

    Python/Django(CBV/FBV/ORM操作) CBV:url对应的类(模式) ##====================================CBV操作============ ...

  5. Django笔记--模型

    ORM是"对象-关系-映射"的简称,在Django当中,ORM就是模型类的管理器对象.操作顺序是先定义模型类,再定义模型类管理器,然后在模型类中实例化一个模型类管理器的对象,作为模 ...

  6. 在Django中使用ORM创建图书管理系统

    一.ORM(对象关系映射) 很多语言的web框架中都有这个概念 1. 为什么要有ORM? 1. 写程序离不开数据,要使用数据就需要连接数据库,但是不同的数据库在sql语句上(mysql,oracle等 ...

  7. Django中的ORM框架使用小技巧

      Django中的ORM框架使用小技巧 作者:尹正杰  版权声明:原创作品,谢绝转载!否则将追究法律责任. Django对各个数据提供了很好的支持,包括PostgreSQL,MySQL,SQLite ...

  8. django中的ORM介绍和字段及字段参数

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

  9. Django中的ORM介绍,字段以及字段的参数。

    Object Relational Mapping(ORM) ORM介绍 ORM概念 对象关系映射(Object Relational Mapping,简称ORM)模式是一种为了解决面向对象与关系数据 ...

随机推荐

  1. ios学习笔记

    1.对于autorelease的理解 Each thread in a Cocoa application maintains its own stack of autorelease pool bl ...

  2. firefox(ff)下无法显示bootstrap图标问题的解决方案(转)

    原文链接: http://www.th7.cn/web/html-css/201502/82548.shtml 后在网上搜到了解决方案,在此分享以供各位遇到问题的同好参考:在ff的地址栏中输入“abo ...

  3. POJ3169 Layout

    Description Like everyone else, cows like to stand close to their friends when queuing for feed. FJ ...

  4. poj 3311 tsp入门

    题意:n+1个点:0--n,找一条路径从0点出发遍历1--n的点再回到0,每个点可经过不止一次,求最短路径 裸的TSP问题,先用Floyd求出各个点之间最短路,再状压dp即可 用n+1位二进制表示状态 ...

  5. html转jsp乱码问题

    先由html后缀转为jsp后缀.然后添加 <%@ page language="java" import="java.util.*" pageEncodi ...

  6. C语言学习-01第一个C语言程序

    一 C语言的历史 C语言是一门通用计算机编程语言,应用广泛.C语言的设计目标是提供一种能以简易的方式编译.处理低级存储器.产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言. 尽管C语言提供 ...

  7. iOS 知识点梳理

    OC的理解与特性 OC作为一门面向对象的语言,自然具有面向对象的语言特性:封装.继承.多态.它既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定.动态加载等).总体来讲,OC确实是一门不错 ...

  8. linux磁盘空间清理

    由于当初安装系统设计不合理,有些分区的过小,以及网络通讯故障等造成日志文件速度增长等其他原因都可以表现为磁盘空间满,造成无法读写磁盘,应用程序无法执行等.下面就给你支几招(以/home空间满为例): ...

  9. HttpClient教程

    2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已 ...

  10. MyEclipse------如何添加jspsmartupload.jar+文件上传到服务器

    下载地址:http://download.csdn.net/detail/heidan2006/182263 如何添加jspsmartupload.jar:右键“Web”工程->properti ...