Django学习7:模型(models)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_25046261/article/details/78596768

模型

概述

Django对各种数据库提供了很友好的支持,统一的调用API,我们可以根据自己不同的业务需求选择不同的数据库。

配置数据库

__init__.py
import pymysql

pymysql.install_as_MySQLdb()

settings.py
# 修改DATABASES
{
    'default':{
        'ENGINE':'django.db.backends.mysql',
      'NAME':'数据库名',
      'USER':'数据库用户名',
      'PASSWORD':'数据库密码',
      'HOST':'localhost或者IP',
      'PORT':'3306'
    }
}

ORM简介

概述

对象 - 关系 - 映射

功能

  1. 根据类生成表结构
  2. 将对象、列表的操作转换为sql语句
  3. 将sql查询到的结果转为对象、列表

优点

极大的减轻了开发人员的工作量,不需要面对因数据库的改变而导致代码不能使用

定义模型

模型、属性、表、字段之间的关系

一个模型在数据库中对应一张表,在模型中定义的属性,对应该模型对照表中的一个字段

创建模型类

班级类

class Grades(models.Model):
  gname = models.CharField(max_length=10)
  gdate = models.DateTimeField()
  gboynum = models.IntegerField()
  ggirlnum = models.IntegerField()
  isDelete = models.BooleanField()

  # 重写 __str__() 方法
  def __str__(self):
    return self.gname

学生类

class Students(models.Model):
  sname = models.CharField(max_length=20)
  sage = models.IntegerField()
  sgender = models.BooleanField()
  scontend = models.CharField(max_length=40)
  isDelete = models.BooleanField()
  sgrade = models.ForeignKey('Grades')
  lastTime = models.DateField(auto_now=True)
  createTime = models.DateField(auto_now_add=True)

  def __str__(self):
    return self.sname

元选项

在模型类中定义Meta类,用于设置元信息

属性

db_table 定义数据表名称

ordering 对象的默认排序字段,获取对象的列表时使用

        示例:

            ordering = ['id']   升序

            ordering = ['-id']  降序

    注意:

        排序会增加数据库的开销

示例

class Meta:
  db_table = 'students'
  ordering = ['-id']

类属性

objects

叫做模型管理对象,是Manage类型的对象,用于与数据库进行交互

自定义模型管理对象

class Students(models.Model):
  object2 = models.Manage()

注意:

    为当前类指定模型管理器对象后,django不再为模型生成名为objects的默认模型管理器

模型管理器Manage类的子类

管理器是Django的模型进行数据库查询操作的窗口,Django应用的每个模型都至少拥有一个管理器对象

作用

  1. 修改管理器返回的原始查询集——>重写get_queryset()方法
  2. 向管理器中添加额外的方法

示例

class StudentManager(models.Manager):
  def get_queryset(self):
    return super(StudentsManager, self).get_queryset().filter(isDelete=False)

class Students(models.MOdel):
  object2 = models.Manager()
  objects3 = models.Manager()

创建模型对象

当创建对象时,Django不会对数据库进行读写操作,调用save()方法才会与数据库进行交互,将数据保存到数据库中

注意:

    __init__方法已经在基类models.Model中使用,在自定义模型中无法使用

方法

在模型中增加一个类方法

class StudentsManager(models.Manager):
  def get_queryset(self):
    return super(StudentsManager, self).get_queryset().filter(isDelete=False)

class Students(models.Model):
  object2 = models.Manager()
  object3 = StudentsManager()

  def __str__(self):
    return self.sname

  class Mate:
    db_table = 'students'
    ordering = ['id']

    #类方法
    @classmethod
    def create(cls, name, age, gender, contend, grade, lTime, cTime):
      obj = cls(sname = name, sage = age, sgender = gender, scontend = contend, sgrade = grade, lastTime = lTime, createTime = cTime)
      obj.isDelete = False
      return obj
    grade = Grades.objects.get(pk=1)
    stu = Students.create('张柏芝', 23, False, u'我叫张柏芝', grade, date(year=2017,month=10,day=23), date(year=2017,month=3,day=12))
    stu.save()

模型查询

简介

查询集:

表示从数据库中获取的对象的集合,可以包含有零个、一个或多个过滤器

过滤器:

基于所给的参数限制查询集的结果

从SQL角度来看,查询集合select语句等价,过滤器就像where和limit子句

查询集

在管理器上调用过滤器方法会返回查询集,查询集经过过滤器筛选后返回新的查询集,所以写成链式语法结构

惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库

何时对查询求值?:迭代、序列化、与 if 合用

返回查询集的方法称为过滤器:

  1. all() 得到查询集
  2. filter() 保留符合条件的数据
    filter(键1=值1,键2=值2) —> students = Students.object3.filter(sage=20,sgender=True)
    filter(键1=值1).filter(键2=值2) —> students = Students.object3.filter(sage=20).filter(sgender=True)
  3. exclude() 去掉符合条件的数据
  4. order_by() 对查询排序
  5. values() 一个对象构成一个字典,然后构成一个列表返回

返回多个值的方法:

  1. get() 返回满足条件的对象,student = Students.object3.get(pk=1)

    注意:
    
        如果未找到会引发 模型类.DoesNotExist 异常:student =          Students.object3.get(sage=2000)
    
        如果有多条被返回,会触发 模型类.MultipleObjectsReturned 异常:students =  Students.object3.get(age=20)
    
  2. count() 返回当前查询总条数, Students.object3.all().count()

  3. first() 返回第一个对象, Students.object3.all().first()
  4. last 返回最后一个对象
  5. exists() 判断查询集中是否有数据,如果有则返回True

限制查询集:

查询返回列表,可以用下标的方式进行限制,等同于sql中的limit子句和offset子句

students = Students.object3.all()[5 : 10]

注意:

索引不支持负数

查询集的缓存:

概述:每个查询集都包含一个缓存来最小化对数据库的访问,在新建的查询集中,缓存为空,首次对查询集求值时,会发生数据的查询,Django会将查询到的结果存储到缓存,并返回请求的结果,接下来的对查询集将重用缓存的结果,两个查询集,无法重用缓存,每次查询都会与数据库进行一次交互增加了数据库的压力

字段查询

概述

实现where子句,作为filter(), get()的参数

语法

属性名称__比较运算符 = 值

注意:

    两个下划线

对于外键

使用 属性_id 表示外键的原始值

转义

\

比较运算符

exact

表示判断相等,大小写敏感

contains

是否包含,大小写敏感 Students.object3.filter(sname__contains=’亦菲’)

startswith、endswith

以…开头或结尾,大小写敏感 Students.object3.filter(sname__startwith=’刘’)

扩展(不区分大小写)

iexact icontains istartswith iendswith

isnull

是否为null,值为布尔类型

gt gte lt lte

大于 大于等于 小于 小于等于

Students.object3.filter(sage__gt=20)

year month day week_day hour minute second

对日期类型的属性进行运算

快捷方式

pk 表示primary key,默认的主键是 id

Students.object3.filter(pk__gt=5)

跨关联关系的查询,处理join查询

语法

模型类名小写[属性名][比较]

注意:

可以没有[比较]部分,表示等于,结果等同于inner join

可返回使用,即在关联的两个模型中都可以i使用

需求

带有“薛延美”这三个字的数据在哪个班级

grade = Grades.objects.filter(students__scontend__contains=’薛延美’)

聚合函数

使用aggregate()函数返回聚合函数的值

函数:Avg, Count, Max, Min, Sum

示例:from django.db.models import Max, Min, Sum

    Students.object3.aggregate(Sum('sage'))

F对象

可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,B出现在等号右侧,此时需要对B字段构建F对象

需求

找到所有男学生数大于女学生数的班级:

from django.db.models import F

grades = Grades.object.filter(gboynum__gt=F('ggirlnum'))

支持F对象使用数学运算:

grades = Grades.object.filter(gboynum__gt=F('ggirlnum') * 2)

关联查询:

grades2 = Grades.objects.filter(isDelete=F('students_isDelete'))

对于date、time字段,可以与datetime()进行运算

Q对象

需要进行 or 查询时,使用Q对象

Q对象可以使用&(and)和 | (or)组合

from django.db.models import Q

或:students = Students.object3.filter(Q(sage__gt=50) | Q(sage=30))

与:students = Students.object3.filter(Q(sage=20) & Q(sgender=True))  ==  students = Students.object3.filter(sage=20).filter(agender=True)

非:students = Students.object3.filter(~Q(age=20))
展开阅读全文

没有更多推荐了,返回首页