Django学习笔记(二)——Model专题

Model专题

Django对各类数据库提供了很好的支持,并提供了统一的调用API

配置数据库

①__init__.py
# __init__.py
import pymysql
# 导入mysql数据库api
pymysql.install_as_MySQLdb()
②settings.py
# settings.py
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'root',
        'PASSWORD': '0000',
        'HOST': 'localhost',
        'PORT': '3306',
    }
}

操作流程

配置数据库
修改__init__.py和settings.py文件
定义model类型,一个类型对应一张数据库表
# myapp/models.py
from django.db import models

class Students(models.Model):
    # 自定义模型管理器
    # 使用了自定义模型管理器后,objects就不存在了
    # stuObj = models.Manager()
    stuObj2 = StuManager()
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)
    sgrade = models.ForeignKey('Grades')

class Students(models.Model):
    # 自定义模型管理器
    # 使用了自定义模型管理器后,objects就不存在了
    # stuObj = models.Manager()
    stuObj2 = StuManager()
    sname = models.CharField(max_length=20)
    sgender = models.BooleanField(default=True)
    sage = models.IntegerField()
    scontend = models.CharField(max_length=20)
    isDelete = models.BooleanField(default=False)
    sgrade = models.ForeignKey('Grades')
生成迁移文件
注意:若要重新执生成迁移文件,需将myapp/migrations目录中,除了__init__.py文件以外的文件删除,再生成迁移文件
(learning_environment) F:\pythonfiles\learn_django\project>python manage.py makemigrations
Migrations for 'myapp':
  myapp\migrations\0001_initial.py
    - Create model Grades
    - Create model Students
执行迁移
(learning_environment) F:\pythonfiles\learn_django\project>python manage.py migrate
Operations to perform:
  Apply all migrations: admin, auth, contenttypes, myapp, sessions
Running migrations:
  Applying contenttypes.0001_initial... OK
  Applying auth.0001_initial... OK
  Applying admin.0001_initial... OK
  Applying admin.0002_logentry_remove_auto_add... OK
  Applying contenttypes.0002_remove_content_type_name... OK
  Applying auth.0002_alter_permission_name_max_length... OK
  Applying auth.0003_alter_user_email_max_length... OK
  Applying auth.0004_alter_user_username_opts... OK
  Applying auth.0005_alter_user_last_login_null... OK
  Applying auth.0006_require_contenttypes_0002... OK
  Applying auth.0007_alter_validators_add_error_messages... OK
  Applying auth.0008_alter_user_username_max_length... OK
  Applying myapp.0001_initial... OK
  Applying sessions.0001_initial... OK
数据表的创建
mysql> show tables;
+----------------------------+
| Tables_in_django_learn     |
+----------------------------+
| auth_group                 |
| auth_group_permissions     |
| auth_permission            |
| auth_user                  |
| auth_user_groups           |
| auth_user_user_permissions |
| django_admin_log           |
| django_content_type        |
| django_migrations          |
| django_session             |
| myapp_grades               |
| myapp_students             |
+----------------------------+
12 rows in set (0.00 sec)

ORM

对象——关系——映射
Object——Relation——Mapping
任务
1、根据对象类型,生成表结构
2、将对对象的操作转换成ORM操作
3、将SQL语句操作的结果转换成对象列表
优点
极大地减轻了开发人员的工作量,且不需要因数据库类型的变更而修改代码

定义模型

对应关系
1、一个模型类对应数据库中的一张表
2、模型类中定义的属性对应该模型类对应数据表的字段
django 数据库
模型Model 数据表table
属性 字段
定义属性
属性类型被定义在django.db.models.fields中
字段类型 说明
AutoField 主键类
在model中不写,则自动添加
CharField 字符串类
TextField 大文本字段
对应于HTML中文本域进行显示
IntegerField 整数类
DecimalField 小数类
可选参数max_digits= 显示总位数
decimal_places=小数点后位数
FloatField 浮点数类
BooleanField 布尔类型
可选范围
NullBooleanField 布尔类型
可选范围
DateField 日期类型(YYYY-MM-DD)
可选参数auto_now = True 保存修改时间
auto_now_add = True 保存创建时间
TimeFied 时间类型(HH-MM-SS)
可选参数与上同
但以上两个初始不可同时赋值为True
DateTimeField 日期-时间类型(YYYY-MM-DD HH-MM-SS)
可选参数与上同
FileField 文件类
ImageField 图像类
此外,每个字段都可以允许有以下的字段选项
字段选项 说明
null 若为True,则会将空值以null存入数据库
blanke 若为True,则该字段允许为空白
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若为True,则会在表中会以此字段创建索引
default 设置默认值
primary_key 若为True,则该字段会成为模型的主键字段
unique 若为True,则这个字段在表中必须有唯一值

模型类之间的关系

分类
1、ForeignKey:一对多关系,将该字段定义在多的模型类中
2、ManyToManyField:多对多关系,将该字段定义在两个模型类中
3、OneToOneField:一对一关系,将该字段定义在任意一个模型类中
访问关系
1、一访问多:
	对象.模型类小写_set
	示例:
	grade.students_set,则访问在grade对象中,包含的students对象
2、一访问一:
	对象.模型类小写
	示例:
	grade.students,则访问grade对象中,包含的唯一一个students对象
3、访问id:
	对象.属性_id
	示例:
	student.grade_id,则访问student对象,所属grade的id

元选项

在模型类中定义Meta类,用于设置元信息
db_table:定义数据表名,若不写,则默认为项目名_类名
ordering:对象的默认排序字段
class Students(models.Model):
    class Meta:
        db_table = 'students'
        ordering = ['id']   # ['-id']降序

模型成员

类属性

object 是manager类型的对象,作用是与数据库交互,若用户没有定义管理器,Django将为模型创建一个名为object的manager管理器

自定义管理器Manager类

Manager类是Django与数据库交互的接口,其作用是向管理器中添加额外方法,其二是修改管理器返回的原始查询集(重写get_queryset()方法)
#myapp/models.py
#自定义manager管理器
class StuManager(models.Manager):
    # 查询集经过过滤器筛选,返回新的查询集合
    def get_queryset(self):
        return super(StuManager, self).get_queryset()
class Students(models.Model):
    # 自定义模型管理器
    # 使用了自定义模型管理器后,objects就不存在了
    # stuObj = models.Manager()
    stuObj2 = StuManager()

创建对象

目的:向数据库中添加数据
创建对象时,django与数据库不进行读写操作,调用对象的save()方法时,才会保存对象至数据库
方法一

在模型类中增加创建对象的类方法

class Students(models.Model):
#     定义一个类方法创建对象
    @classmethod
    def createStu(cls, name, age, gender, contend, grade, isD=False):
        student = cls(sname=name,
                      sage=age,
                      sgender=gender,
                      scontend=contend,
                      isDelete=isD,
                      sgrade=grade,
                      )
        return student
方法二

在自定义管理器中添加方法

#自定义manager管理器
class StuManager(models.Manager):
    # 自定义管理器创建对象
    def creatstudents(self,name, age, gender, contend, grade, isD=False):
        stu = self.model()
        stu.sname = name
        stu.age = age
        stu.sgender = gender
        stu.scontend = contend
        stu.sgrade = grade
        return stu

模型查询

查询集

以数据库中获取的对象构成的集合
1、可以在管理器上调用过滤器方法

class StuManager(models.Manager):
    # 查询集经过过滤器筛选,返回新的查询集合
    def get_queryset(self):
        return super(StuManager, self).get_queryset().filter(isDelete=False)

2、经过过滤器输出的仍然是一个查询集,可以多次调用filter方法

class StuManager(models.Manager):
    # 查询集经过过滤器筛选,返回新的查询集合
    def get_queryset(self):
        return super(StuManager, self).get_queryset().filter(isDelete=False).filter().filter()

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

4、直接访问数据的情况:迭代、序列号和与if合用

5、返回查询集的过滤器

方法 功能
all() 返回全部数据,不过滤内容
filter() 获取指定内容
形式:filter(key = values).filter().filter()可多次获取
exclude() 除去符合条件的数据
order_by() 排序
values() 返回一个列表,内容为对象的字典形式

6、返回单个数据

方法 功能
get() 返回一个满足条件的对象
可能存在的异常包括:
若未匹配数据会引发ObjectNotExist异常
若存在多个匹配数据会引发MultipleObjectReturn异常
count() 返回查询集中的对象个数
first() 返回查询集中的第一个对象
last() 返回查询集中的最后一个对象
exists() 判断查询集中是否有目标数据

7、限制查询集个数
使用下标的方式(切片操作)

#通过切片进行分页操作
def stupage(request, page):
    start_num = int(page)-1
    end_num = int(page)
    student_list = Students.stuObj2.all()[start_num:end_num]
    return render(request, 'myapp/students.html', {'students': student_list})

8、查询集的缓存
每个查询集都有缓存,以减少对数据库的访问次数。在新建的查询集中,缓存首次为空,会发生数据缓存,django会将查询集的数据进行缓存,并返回查询结果。此次之后的查询将直接使用查询集的缓存。

9、字段查询
实现了sql中的where语句,作为方法filter(),exclude(),get()的参数。
语法:属性名称__比较运算符=值(双下划线)
外键:属性名_id (单下划线)
转移:

比较运算符 含义
exact 判断。区分大小写
contains 包含。区分大小写
startswith 以…起始
endswith 以…结束
isnull 为空
isnotnull 非空
in 是否包含在范围内
gt
gte
lt
lte
>
>=
<
<=
year
month
day
week_day
hour
minute
second






studentslist = Students.stuObj2.filter(sname__contains='chen')
studentslist = Students.stuObj2.filter(sname__startswith='chen')
studentslist = Students.stuObj2.filter(isname__startswith='chen')
studentslist = Students.stuObj2.filter(sname__in=['chen', 'li'])
studentslist = Students.stuObj2.filter(sage__gt=10)

10、跨关联查询
处理join(关联)查询
语法: 模型类名__属性名__比较运算符

grade_class = Grades.objects.filter(students_scontend_contains = 'chendingwei')

11、查询快捷
pk代表主键,主键字段可以自动设置为自增数列,或人工在model中标识主键

grade = Grades.objects.get(pk=2)

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

聚合函数 含义
Avg 平均值
Count 累积
Max 最大值
Min 最小值
Sum 求和
# 需要从models中导入需要的聚合函数
from django.db.models import Max
def studentsearch(request):
	maxage = Students.stuObj2.aggregate(Max('sage'))
	return HttpResponse('0000')

13、F对象
①比较同一个模型中的A属性和B属性
②支持F对象的算术运算

grade_gril = Grades.objects.filter(ggrilnum__gt=F('gboynum'))
grade_gril = Grades.objects.filter(ggrilnum__gt=F('gboynum')+20)

14、Q对象
过滤器方法中的关键字参数,使用Q对象可以解决“或”的逻辑关系,~Q表示取反。

studentslist = Students.stuObj2.filter(Q(pk__lte=3) | Q(sage__gt=50))

你可能感兴趣的:(django)