DjangoORM框架(一)

时间秒杀一切 提交于 2020-01-18 05:39:04

ORM原理

对象关系映射 (Object Relational Mapping ,简称ORM )是一种为了解决面向对象 与关系数据库 存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象 和数据库之间映射的元数据 ,

Python配置MySql环境

1.下载:
pip install pymysql
pip install mysqlclient
2.创建Django项目,在主路由的setting文件中修改数据库设置:

	DATABASES = {
	'default': { 'ENGINE' : 'django.db.backends.mysql',
	'HOST': 'localhost',
	'PORT': '3306',
	'NAME': '【数据库名称】',
	'USER': '【MySQL账号】',
	'PASSWORD': '【密码】'} }

填写配置的数据库名称,用户名和密码就完成了环境的配置

表与字段的常用字段约束

表与字段的定义

字段类型关键字 说明
AutoField 自动增长的整数(相当于:int auto_increment)说明:常用的参数:primary_key=True(定义主键)如果不写id=models.AutoField(primary_key=True),Django也会创建一个自增的主键id
IntegerField 整数int
Decimal 定点数 必填参数:max_digits:最大总位数 decimal_places:小数位数
CharField 字符串
TextField 大文本Text
BooleanField True
DateTimeField 日期 常用参数:auto_now:每次修改对象,自动设置时间 auto_now_add:第一次被创建,自动设置时间
EmailFiled 邮箱
ImageField 图片

常用的字段约束

关键字 说明
primary_key 是否是主键 默认值(Flase)
null 是否为空 默认值(Flase)
unique 是否重复 默认值(Flase)
default 默认值 默认值(Flase)
blank 在django管理后台新增或编辑一条表数据时,该字段能否为空 null是数据库范畴,blank是表单验证范畴默认值(Flase)

代码:

from django.db import models
import datetime
# Create your models here.
class User(models.Model):
    # id=models.AutoField(primary_key=True)  # 可以省略
    username=models.CharField(max_length=16,unique=False)
    passworld=models.CharField(max_length=16,unique=False)
    gender=models.PositiveSmallIntegerField(default=0)
    age=models.IntegerField(null=True)
    createDatetime=models.DateTimeField(auto_now_add=datetime.datetime.now())

数据库的迁移与维护

在PyCharm的终端中执行:
生成迁移文件:
python manage.py makemigrations
执行迁移文件:
python manage.py migrate

模型类的增删改

在终端中输入相应的命令:


D:\Python练习\ORM框架\模型类实现>python manage.py shell
Python 3.7.4 (tags/v3.7.4:e09359112e, Jul  8 2019, 20:34:20) [MSC v.1916 64 bit (AMD64)]
Type 'copyright', 'credits' or 'license' for more information
IPython 7.8.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: from user.models import *

In [2]: user =User()

In [3]: user.username='username1'

In [4]: user.id

In [5]: user.save()

In [6]: user.id
Out[6]: 1

In [7]: user.passworld='passworld'

In [8]: user.save()

In [9]: user.delete()
Out[9]: (1, {'user.User': 1})

In [10]: user =User.objects.create()

In [11]: user.delete()
Out[11]: (1, {'user.User': 1})

In [12]: user=User.objects.create(username='名字1')

In [13]: User.objects.filter(id=3).update(passworld='passworld1')
Out[13]: 1
In [15]: User.objects.filter(id=3).delete()
Out[15]: (1, {'user.User': 1})

In [16]: exit

模型类的查询方法

方法 说明
all 返回所有
get(条件) 返回满足条件的数据(对象)
filter(条件) 返回满足条件的数据(列表)
exclude(条件) 返回不满足条件的数据(列表)

代码:

 user=User.objects.get(id=1) #get方法
 user_1=User.objects.all() #all方法
 user_2=User.objects.filter(id=1) #filter方法
 user_3=User.objects.exclude(id=1) #exclude方法
 

比较查询

方法 说明
相等 exact
大于 gt
大于等于 gte
小于 lt
小于等于 lte
查询为空 isnull

代码:

 user=User.objects.filter(iddelete__exact=0) #等于
 user_2=User.objects.filter(money__gte=1000)  #大于等于
 user_3=User.objects.filter(money__gt=1000) #大于
 user_4=User.objects.filter(money__lt=1000) #小于
 user_5=User.objects.filter(money__lte=1000) #小于等于
 user_6=User.objects.filter(birthday__isnull=True)

模糊查询

方法 说明
包含 contains
开头 startswith
结尾 endwith

代码:

user=User.objects.filter(username__contains='1') #包含
user_1=User.objects.filter(username__startwith='name1') #以什么开头
user_2=User.objects.filter(username__endwith='@qq.com') #以什么结尾

范围查询

方法 说明
in 范围

例子:

user=User.objects.filter(username__in('name1','name2'))

F对象和Q对象

F对象:同一行比较
例子:

from django.db.models import F
    # 同行数据字段互相比较
    # 查询在第一次创建后,发生修改的对象
    user=User.objects.filter(updateTime__gt=F('createTime'))

Q对象:逻辑比较
例子:

from django.db.models import Q
    #查询余额大于5000的男性
    user_1=User.objects.filter(Q(money__gt=5000) & Q(gender__exact=0))
    #查询余额大于5000的男性或者余额大于2000的女性
    user_2=User.objects.filter(Q(money__gt=5000,gender__exact=0) | Q(money__gt=2000,gender__exact=1))
    

懒加载和链式调用

懒加载:
当使用到模型类的数据时,才向数据库加载数据的具体内容
懒加载的好处:节省内存
链式调用:

user_all=User.objects.all().order_by('createTime','-birthday')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!