模型

Django模型其实就是存储的数据和字段,每一个模型类都映射一张表。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model。每一个模型类对应数据库中一张表。
  • 模型类的每个属性都相当于一个数据库的字段。每个属性值对应表中一个字段。

创建模型

  1. from django.db import models
  2. class Person(models.Model):
  3. # 定义字段选项
  4. SEX_TYPE = (
  5. ('M', 'Male'),
  6. ('F', 'Female')
  7. )
  8. p_name = models.CharField(max_length=128, unique=True, db_column='name')
  9. p_age = models.IntegerField(default=18, db_column='age')
  10. p_sex = models.CharField(max_length=1, choices=SEX_TYPE)
  11. class Meta:
  12. 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:判断结果集是否有内容