作者:刘耀

一、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. 判断一个数据是否存在于一个表中,Oracle中写自定义函数

    create or replace function isExist(data in DataTypes) --DataTypes 为表中该数据的类型return Numberisv_flag num ...

  2. USACO 3.2 kimbits DP

    自己YY了个DP:设f[n][l]为n位数中包含不超过l个1的总个数 f[n][l]=f[n-1][l]+f[n-1][l-1] 然后用_search()从高位向低位扫描即可,tmp记录当前已记下多少 ...

  3. HYSBZ 4197 寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

  4. 一个完整的编译器前端-A.1 源语言

    这个语言的一个程序由一个块组成,该块中包含可选的声明和语句.语法符号basic表示基本类型. program –> block block   –> { decls stmts } dec ...

  5. HTTPS 协议降级攻击原理

    0x00 HTTPS 在传统流行的web服务中,由于http协议没有对数据包进行加密,导致http协议下的网络包是明文传输,所以只要攻击者拦截到http协议下的数据包,就能直接窥探这些网络包的数据. ...

  6. java内存模型及GC原理

    java内存模型 sun官方网站:sun java 虚拟机模型 JVM内存模型中分两大块,一块是 NEW Generation, 另一块是Old Generation. 在New Generation ...

  7. [Angularjs]ng-show和ng-hide

    写在前面 上篇文章介绍了ng-select和ng-options指令的使用,这篇文章继续指令的学习,本篇文章讲学习ng-show和ng-hide指令. 系列文章 [Angularjs]ng-selec ...

  8. PHP中应用GD2函数在图像上添加文字

    <?php header("Content-type:text/html;charset=utf-8"); header("Content-type:image/g ...

  9. Visual Studio Online Integrations

                                                                                                         ...

  10. DetachedCriteria详细使用

    一.基本使用 1. 说明 Restrictions 是产生查询条件的工具类. 2. 定义 可以直接用class 创建 DetachedCriteria searDc = DetachedCriteri ...