如何在django中使用models.py对数据库进行操作

一配置数据库

在上一篇文章中就已经提过这个问题,在这个就重新说一下吧

  1. 先找到与你项目同名的目录下的__init__.py文件,在其中输入以下代码,以保证mysql数据库能够正常操作

    import pymysql
    pymysql.install_as_MySQLdb()

  2. 在同级目录下的seetings.py中找到DATABASES模块作以下修改

    DATABASES = {
    ‘default’: {
    # 关联的数据库类型
    ‘ENGINE’: ‘django.db.backends.mysql’,
    # 数据库名
    ‘NAME’: ‘super’,
    # 数据库登陆用户名
    ‘USER’: ‘root’,
    # 数据库登陆密码
    ‘PASSWORD’: ‘xxxxxxx’,
    # 主机名
    ‘HOST’: ‘localhost’,
    # 端口号
    ‘PORT’: ‘3306’,
    }
    }

  3. 在应用目录下的models.py文件中,创建模型类,用以对数据库的操作,注意,此时需已创建对应的数据

二了解model模块

  1. 概述
    django对数据库提供了很友好的支持
    django为这些数据库提供了统一的API,我们可以根据不同的业务需求来选择数据库
  2. ORM简介
    ORM :对象-关系-映射
    功能:根据我们在models.py 中创建的模型类生成表结构
    将对象,列表的操作转换成对应的sql语句
    将sql语句查询到的结果转换成对象或者是列表
    优点:
    极大的减轻了开发人员的负担,不需要面对因数据库的改变该导致的代码重构

三定义模型

  1. 简述
    模型主要就是对数据表,字段的操作
    每个模型都应该对应着一张数据表,在模型中定义的属性对应着表中的一个字段

  2. 定义属性
    属性的类型和约束条件都比较多,可以自行百度,我在这里就不说了3. 创建模型类

    班级类

    class Grades(models.Model):
    gname = models.CharField(max_length=10)
    gdate = models.DateTimeField()
    gboynum = models.IntegerField()
    ggirlnum = models.IntegerField()
    isDelete = models.BooleanField()
    # 当实例化这个类后会默认返回这个值,可打印
    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()
       createTime = models.DateField()
       def __str__(self):
         	return self.sname
         
   在cmd中找到你的项目目录通过以下命令生成迁移文件并迁移即可
   python manage.py makemigrations
   python manage.py migrate
  1. 元选项
    在模型类中定义Meta类,用于设置元信息
    属性:db_table 定义数据表在数据库中的名称
    ordering 对象的默认排序字段,在获取对象的时候时候使用,既获取的对象会按照你设置的顺序排列 ordering = [‘id’] 为升序 ordering[’-id’]为降序
    注意:排序会增加数据库的开销
    # 示例

    class Meta:
      	db_table = 'students'
        ordering = ['-id']
    
    1. 类属性
      objects:模型管理器对象,是Maneger类型的对象,用于和数据库交互

      自定义模型管理器对象
      class Students(models.Model):
      object2 = models.Manager()
      注意:在自定义模型管理器对象以后,django自带的objects模型管理对象将会失效
      模型管理器Manager类的子类:

      1. 管理器是django模型与数据库进行交互的接口,django的每个模型都应该至少拥有一个管理器对象
      2. 作用:修改管理器返回的结果集,重写get_queryset()方法
        向管理器中添加额外的方法
  2. 示例

       class StudentsManager(models.Manager):
         	def get_queryset(self):
             	return super(StudentsManager, self).get_queryset().filter(isDelete=False)
       class Students(model.Model):
         	object2 = model.Manager()
           object3 = StudentManager()
    

6.创建模型对象
当创建对象时,Django不会对数据库进行读写操作,调用save()方法后才能与数据进行交互,将对象保存到数据库中
注意:在model中__init__方法已经在models.Model中使用,在自定义模型中无法使用
方法一:
在模型中添加一个类方法

      @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
        
       # 视图中如下:
      	def student(request):
          	grade = Grades.objects.get(pk=2)
          	stu = Students.create("张",23,False,u'我叫张', grade, 			                     date(year=2015,month=11, day=3),date(year=2015,month=11, day=3))
              stu.save()

方法二:
从Manager子类中添加

      def create(self, name, age, gender, contend grade, lTime, cTime):
        	obj = self.model()
          obj.sname = name
          obj.sage = age
          obj.sgender = gender
          obj.scontend = contend
          obj.sgrade = sgrade
          obj.lastTime = lTime
          obj.createTime = cTime
          obj.isDelete = False
          return obj
        
      # 视图中如下
      def student(request):
          	grade = Grades.objects.get(pk=2)
          	stu = Students.object3.create("张",23,False,u'我叫张', grade, 			                     date(year=2015,month=11, day=3),date(year=2015,month=11, day=3))
              stu.save()

四,查询集
1. 简介
查询集:表示从数据库中获取的对象的集合
可以包含零个,一个或多个过滤器
过滤器:基于所给的参数限制查询集的结果
从sql角度来看,查询集合与select语句等价,过滤器就像where和limit子句
2. 查询集
在管理器上调用过滤器方法会返回查询集
查询集经过过滤器筛选后会返回新的查询集,一般会写成链式语法结构
惰性执行,创建查询集不会带来任何数据库的访问,直到调用数据时才会访问数据库
何时对查询集求职?迭代,序列化,与if合用
返回查询集的方法称为过滤器
all() # 得到查询集
filter() # 保留符合条件的数据 可以用链式,也可以在括号内用逗号分隔写多个条件
exclude() # 去掉符合用户自定义条件的数据,与上一个 语意相反
oder_by() # 对查询集进行排序
values() # 返回结果为:列表内包含字典,字典内包含对象的结构
# 返回单个值
get() # 注意:未找到数据会引发 “模型类.DoesNotExists”异常,存在多个会引发"模型.MultipleObjectReturned”异常
count() # 会统计当前查询到的数据的总条数
first() # 返回当前查询集中的第一个对象
last() # 返回当前查询集中的最后一个对象
exists() # 判断查询集中是否存在数据,如果存在则为True
# 限制查询集
# 由于查询集是一个列表,所以可以通过类似列表切片的方法截取其中数据,类似于sql语句中的
# offset子句和limit子句
students = Students.object3.all()[0: 5]
# 注意 索引不支持负数
3. 查询集的缓存
概述: 每个查询集都包含一个缓存来最小化对数据库的访问
在新建的查询集中,缓存为空,每次对查询集求值时,会发生数据的查询,django会将查询的结果存入缓存中
两个查询集无法重用缓存,每次查询都会与数据库发生一次交互,增加了数据库的压力
4.字段查询
实现where子句,作为filter() exclude() get()的参数
语法 属性名称__比较运算符 = 值 注意,这里是两个下划线
对于外键,使用属性_id表示外键的原始值
5. 比较运算符
exact判断相等,大小写敏感
contains 是否包含,大小写敏感

   Students.object3.filter(sname__contains='亦菲')
	startwith,endwith 以什么开头,以什么结尾
   students.object3.filter(sname__startwith='张')

在上面四个属性前加上i即不区分大小写
isnull 是否为空 值为布尔值
gt大于,gte大于等于,lt小, lte小于等于
快捷方式,
Students.object3.filter(pk__gt=5)
跨关联关系
处理join查询,即两个表存在一定关联,或内关联,左关联,右关联,或者显式关联
查询带有下面名字人所在的班级
grade = Grades.objects.filter(students__scontend__contains = ‘薛延美’)
6.聚合函数
使用aggregate()函数返回的值
函数 Avg ,Count,Max,Min,Sum
from django.db.models import Max, Count, Max, Min, Sum
Students.object3.filter(Max(‘id’))
7.F对象
可以使用模型的字段A与字段B进行比较,如果字段A写在了等号左侧,B出现在等号右侧,
此时需要对B字段构成F对象
找到所有男同学数量大于女同学数量的班级
from django.db.models import F
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’))
支持F对象使用数学运算
grade = Grades.objects.filter(gboynum__gt=F(‘ggirlnum’)*2)
关联查询
grade2 = Grades.objects.filter(isDelete=F(‘students__isDelete’))
8.Q对象
概述:需要进行or查询时,使用Q对象
Q对象可以使用&和|组合起来

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

students = students.object3.filter(Q(sage__gt=50) & Q(sgender = True))

students = students.object3.filter(~Q(sage__gt=50))

你可能感兴趣的:(框架安装)