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

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

原文 http://blog.csdn.net/qq_35064031/article/details/78596601

2017-11-22 02:01:35阅读(301)

一配置数据库

在上一篇文章中就已经提过这个问题,在这个就重新说一下吧
1. 先找到与你项目同名的目录下的init.py文件,在其中输入以下代码,以保证mysql数据库能够正常操作

import pymysql
pymysql.install_as_MySQLdb()

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

DATABASES = {
    'default': {
        # 关联的数据库类型
        'ENGINE': 'django.db.backends.mysql',
        # 数据库名
        'NAME': 'super',
        # 数据库登陆用户名
        'USER': 'root',
        # 数据库登陆密码
        'PASSWORD': 'Xjt199644',
        # 主机名
        'HOST': 'localhost',
        # 端口号
        'PORT': '3306',
    }
}
在应用目录下的models.py文件中,创建模型类,用以对数据库的操作,注意,此时需已创建对应的数据

二了解model模块

概述
django对数据库提供了很友好的支持
django为这些数据库提供了统一的API,我们可以根据不同的业务需求来选择数据库 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()方法
            向管理器中添加额外的方法

3. 示例

      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))

最新发布

CentOS专题

关于本站

5ibc.net旗下博客站精品博文小部分原创、大部分从互联网收集整理。尊重作者版权、传播精品博文,让更多编程爱好者知晓!

小提示

按 Ctrl+D 键,
把本文加入收藏夹

天天可领!最高99块!土豪站长12月发红包啦!

关闭
支付宝红包