模型
Django模型其实就是存储的数据和字段,每一个模型类都映射一张表。
- 每个模型都是一个 Python 的类,这些类继承
django.db.models.Model。每一个模型类对应数据库中一张表。 - 模型类的每个属性都相当于一个数据库的字段。每个属性值对应表中一个字段。
创建模型
from django.db import modelsclass Person(models.Model):# 定义字段选项SEX_TYPE = (('M', 'Male'),('F', 'Female'))p_name = models.CharField(max_length=128, unique=True, db_column='name')p_age = models.IntegerField(default=18, db_column='age')p_sex = models.CharField(max_length=1, choices=SEX_TYPE)class Meta:db_table = 'db_person'
迁移至数据库
# 生成迁移文件
python manage.py makemigrations
# 执行迁移
python manage.py migrate
创建URL路由
from django.conf.urls import url
from App import views
urlpatterns = [
url(r'^addperson', views.addPerson),
url(r'^querypersons', views.queryPersons),
url(r'^getmaxage', views.getMaxAge)
]
创建视图
import random
from django.db.models import Max, Avg
from django.http import HttpResponse
from django.shortcuts import render
from App.models import Person
# Create your views here.
def addPerson(request):
for i in range(15):
person = Person()
person.p_name = 'erick-{}'.format(i)
person.p_age = random.randrange(18, 100)
person.p_sex = random.choice(['S', 'M'])
person.save()
return HttpResponse('添加成功')
def queryPersons(request):
# 方法all()返回一个包含数据库中所有对象的queryset对象
person = Person.objects.all()
print(person.values())
# 对返回对象进行切片,并非是查询全部结果后在切片, 而是相当于sql中的limit和offset
person = Person.objects.all()[:2]
print(person.values())
# filter()和exclude()并不直接查询数据库,懒查询,只有在迭代结果集或获取单个对象属性的时候,才会真正查询数据库。
# filter()方法,返回满足给定查询参数的queryset对象
person = Person.objects.filter(p_age__gt=35).filter(p_sex='S')
print(person.values())
# exclude()方法,返回不满足给定查询参数的queryset对象
person = Person.objects.exclude(p_age__gt=30).filter(p_sex='S')
print(person.values())
# get()方法检索单个对象,需要保证返回的queryset只包含一个元素,否者将会抛出异常
person = Person.objects.get(p_age=29)
print(person.p_name)
# 查询时不区分大小写
person = Person.objects.get(p_name__iexact='erick-14')
print(person.p_name)
# 对结果集进行排序
person = Person.objects.order_by('p_age')
print(person.values())
# 返回结果集的第一个元素
person = Person.objects.all().first()
print(person.p_name)
# 返回结果集的最后一个元素,建议使用last或first方法前先进行order_by排序
person = Person.objects.all().order_by('id').last()
print(person.p_name)
return HttpResponse('Query Success')
def getMaxAge(request):
# 获取字段最大值Max,平均值Avg,最小值Min
result = Person.objects.aggregate(Max('p_age'))
print(result)
return HttpResponse('Get Success')
跨关系关联
当基于多对多或一对多筛选对象时,比如需要查找名字为jack属于哪个班级
def getPerson(request):
# 通过班级表Grade的一对多关系关联Student表,通过级联数据来查找
result = Grade.objects.filter(students__s_student='jerry')
print(result)
return HttpResponse('Get Success')
同时也支持反向操作
def getPerson(request):
result = Students.objects.filter(s_grade__g_name__contains='class01')
print(result)
return HttpResponse('Get Success')
filter字段查询即SQL中的Where子句,在Django中基本的查询关键字可以使用field__lookuptype=value的形式进行,除上面的外也支持一下类型:
- in 在某一集合中
- contains 模糊查询
- startswitch 以xx开始,本质也是模糊查询
- endswitch 以xx结尾,也是模糊查询
- iexact 不区分大小写
F对象
前面的例子,都是通过filter将模型字段值与常量比较,Django也提供了将模型字段值与同一模型另一字段做比较,即使用F()表达式
创建模型
class Company(models.Model):
tech = models.CharField(max_length=128)
boy_num = models.IntegerField(default=5)
girl_num = models.IntegerField(default=10)
需求:查询company表中boy_num大于girl_num的行
创建视图
def getcompany(request):
result = Company.objects.filter(boy_num__gt=F('girl_num'))
print(result.values())
return HttpResponse('get Success')
F()的实例充当查询中的模型字段的引用,这些引用可以再查询过滤器中用于同一模型中不同字段的比较
同样F对象也支持算术运算
def getcompany(request):
result = Company.objects.filter(boy_num__lt=F('girl_num') + 5)
print(result.values())
return HttpResponse('get Success')
Q对象
在filter中,查询使用的关键字是通过fileter().fileter()的方式进行链式查询,从来模拟SQL中的AND操作,Django提供了一个Q对象用于压缩关键字参数集合,简化对复杂查询的操作
同样Q对象也支持逻辑运算(与或非)
- 查询boy_num大于1并且girl_num大于5的数据
def getcompany(request):
# 使用传统filter方法
result = Company.objects.filter(boy_num__gt=1).filter(girl_num__gt=5)
# 使用Q对象
result = Company.objects.filter(Q(boy_num__gt=1) & Q(girl_num__gt=5))
print(result.values())
return HttpResponse('get Success')
总结
ORM
ORM就是对象关系映射,将业务逻辑和SQL语句进行解耦。
CRUD
- Create创建对象的方式:
- 直接实例化对象,设置属性
- 创建对象,传入属性
- 使用Model.objects.create()
- 自己封装类方法创建
- 在Manager中封装方法创建
- Update更新操作
- 基于Model.object查询结果进行更新
- Delete删除操作
- 基于Model.object查询结果进行删除
- R查询操作
- 通过Model.object获取查询结果集,以下几种方式均返回queryset结果集
- all,filter,exclude,order_by,values,切片
- 获取单个对象
- get:不存在会抛异常,存在多于一个也会抛异常
- last:获取最后一个结果
- first:获取第一个结果
- 内置函数
- count:获取结果集数量
- exists:判断结果集是否有内容
- 通过Model.object获取查询结果集,以下几种方式均返回queryset结果集
