Python——django 学习笔记(二) 模型

Python——django 学习笔记2 模型

  • 静态文件
  • 连接mysql数据库
    • 字段类型
    • 选项
    • 外键
    • 迁移
    • 设置数据库连接mysql数据库
  • 数据增删改查
    • 新增数据
    • 修改(更新)数据
    • 删除数据
    • 基本查询数据
    • filter,get,exclude
    • F和Q对象
      • F对象
      • Q对象
    • 聚合函数
    • 排序函数
    • 关联查询
    • 查询集QuerySet

静态文件

在setting.py 里设置

# django通过STATIC_URL区分静态资源和动态资源
# 访问资源 http://ip:port/STATIC_URL/文件名
STATIC_URL = '/static/'

# 设置静态文件路径
STATICFILES_DIRS = [
    BASE_DIR / 'static'
]

连接mysql数据库

更改子应用的模块modles.py

from django.db import models

# Create your models here.
"""
书籍表:
    id,name,pub_date,read_count,comment_count,is_delete
    
    verbose_name 在admin后台显示
"""


class BookInfo(models.Model):
    # 属性名=属性类型(选项)
    name = models.CharField(max_length=10, verbose_name='名字')
    # 发布日期
    pub_date = models.DateField(null=True)
    # 阅读量
    read_count = models.IntegerField(default=0)
    # 评论量
    comment_count = models.IntegerField(default=0)
    # 是否逻辑删除
    is_delete = models.BooleanField(default=False)
    pass

    class Meta:
        # 改表名
        db_table = 'bookinfo'
        # 修改后台admin的显示信息的配置
        verbose_name = 'admin'

    def __str__(self):
        return self.name


# 准备人物列表信息的模型类
class PeopleInfo(models.Model):
    # 有序字典
    GENDER_CHOICES = (
        (0, 'male'),
        (1, 'female')
    )
    name = models.CharField(max_length=20, verbose_name='名称')
    gender = models.SmallIntegerField(choices=GENDER_CHOICES, default=0, verbose_name='性别')
    description = models.CharField(max_length=200, null=True, verbose_name='描述信息')
    book = models.ForeignKey(BookInfo, on_delete=models.CASCADE, verbose_name='图书')  # 外键
    is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')

    class Meta:
        db_table = 'peopleinfo'
        verbose_name = '人物信息'

    def __str__(self):
        return self.name

1) 数据库表名

模型类如果未指明表名,Django默认以小写app应用名_小写模型类名为数据库表名。

可通过db_table指明数据库表名。

2) 关于主键

django会为表创建自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后django不会再创建自动增长的主键列。

默认创建的主键列属性为id,可以使用pk代替,pk全拼为primary key。

3) 属性命名限制

不能是python的保留关键字。
不允许使用连续的下划线,这是由django的查询方式决定的。
定义属性时需要指定字段类型,通过字段类型的参数指定选项,语法如下:
属性=models.字段类型(选项)

字段类型

类型 说明
AutoField 自动增长的IntegerField,通常不用指定,不指定时Django
BooleanField 布尔字段,值为True或False
NullBooleanField 支持Null、True、False三种值
CharField 字符串,参数max_length表示最大字符个数
TextField 大文本字段,一般超过4000个字符时使用
IntegerField 整数
DecimalField 十进制浮点数, 参数max_digits表示总位数, 参数decimal_places表示小数位数
FloatField 浮点数
DateField 日期, 参数auto_now表示每次保存对象时,自动设置该字段为当前时间,用于"最后一次修改"的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add表示当对象第一次被创建时自动设置当前时间,用于创建的时间戳,它总是使用当前日期,默认为False; 参数auto_now_add和auto_now是相互排斥的,组合将会发生错误
TimeField 时间,参数同DateField
DateTimeField 日期时间,参数同DateField
FileField 上传文件字段
ImageField 继承于FileField,对上传的内容进行校验,确保是有效的图片

选项

选项 说明
null 如果为True,表示允许为空,默认值是False
blank 如果为True,则该字段允许为空白,默认值是False
db_column 字段的名称,如果未指定,则使用属性的名称
db_index 若值为True, 则在表中会为此字段创建索引,默认值是False
default 默认
primary_key 若为True,则该字段会成为模型的主键字段,默认值是False,一般作为AutoField的选项使用
unique 如果为True, 这个字段在表中必须有唯一值,默认值是False

null是数据库范畴的概念,blank是表单验证范畴的

外键

在设置外键时,需要通过on_delete选项指明主表删除数据时,对于外键引用表数据如何处理,在django.db.models中包含了可选常量:

CASCADE 级联,删除主表数据时连通一起删除外键表中数据
PROTECT 保护,通过抛出ProtectedError异常,来阻止删除主表中被外键应用的数据
SET_NULL 设置为NULL,仅在该字段null=True允许为null时可用
SET_DEFAULT 设置为默认值,仅在该字段设置了默认值时可用
SET() 设置为特定值或者调用特定方法
DO_NOTHING 不做任何操作,如果数据库前置指明级联性,此选项会抛出IntegrityError异常

迁移

mysql修改默认端口号后从linux命令行登录

# mysql -uroot -p -h  --hort
mysql -uroot -pabc123 -h 127.0.0.1 --prot 3306

mysql修改默认端口号后从windows命令行登录

# mysql -u root -p -P -h
# 大写的P代表端口号,小写的p代表密码,h指定主机地址
mysql -uroot -pabc123 -h127.0.0.1 -P3306

设置数据库连接mysql数据库

  1. 在项目的__init__.py 下插入pymysql模块

    import pymysql
    pymysql.version_info = (1, 4, 13, "final", 0)  # 指定版本
    pymysql.install_as_MySQLdb()
    
  2. 在项目的setting.py 下更改数据库引擎为mysql
    Python——django 学习笔记(二) 模型_第1张图片

  3. 在终端迁移数据表在(环境)项目路径> 输入

    (py3_django) D:\python\pycharm\project\test2\test2>python manage.py makemigr
    ations
    
  4. 生成表到数据库

    D:\python\pycharm\project\test2\test2>python manage.py migr
    	ate
    

    在数据库查看 show tables
    Python——django 学习笔记(二) 模型_第2张图片

数据增删改查

新增数据

  1. 方法一

    
    # 把数生成的数据对象返回 
    book = BookInfo(
    	name='python',
    	pub_date='2000-01-09'
    )
    # 需要手动调用save方法
    book.save()
    
  2. 方法二

    from book.modles improt BookInfo
    BookInfo.objects.create(
        name='js',
        pub_date='2010-01-01'
    )
    

修改(更新)数据

  1. 方式一

    # 1.先查询数据
    # select * from bookinfo where id=1
    book=BookInfo.objects.get(id=1)
    # 2.直接修改实例的属性
    book.read_count=22
    # 3.调用save方法
    book.save()
    
  2. 方式2

    # filter() 过滤
    BookInfo.objects.filter(id=1).update(
        read_count=200,
        comment_count=555
    )
    

删除数据

  1. 方式1

    # 1. 先查询出数据
    book=BookInfo.objects.get(id=5)
    # 2. 调用删除方法
    book.delete()
    
  2. 方式2

    BookInfo.objects.filter(id=6).delete()
    

基本查询数据

# get 得到某个数据
book=BookInfo.objects.get(id=1)
book.name

# all  得到所有数据
BookInfo.objects.all()

# count
BookInfo.objects.all().count()
BookInfo.objects.count()

filter,get,exclude

filter 过滤出多个结果 返回的是列表
exclude 排除掉符合条件剩下的结果
get 过滤单一结果 返回的是对象
语法:以 filter(字段名__运算符=值) 为例

运算符 说明描述
exact 表示判等。
contains 是否包含。
startswith 以指定值开头
endswith 以指定值结尾
in 是否包含在范围内。
gt 大于 (greater than)
gte 大于等于 (greater than equal)
lt 小于 (less than)
lte 小于等于 (less than equal)
isnull 是否为null。
year、month、day、week_day、hour、minute、second 对日期时间类型的属性进行运算

在这些运算符前加上i表示不区分大小写,如iexact、icontains、istartswith、iendswith.

F和Q对象

F对象

F对象,比较两个字段,被定义在django.db.models中
语法:F(‘字段名’)
例:filter(字段名__gt=F(‘字段名’))

Q对象

Q()|Q()
并且 Q()&Q()
not ~Q()
语法: Q(字段名__运算符=值)|Q(字段名__运算符=值)

聚合函数

使用aggregate()过滤器调用聚合函数。聚合函数包括:Avg平均,Count数量,Max最大,Min最小,Sum求和,被定义在django.db.models中。返回值的是字典类型。
语法: aggregate(聚合函数(‘字段名’))
例子:BookInfo.objects.aggregate(Sum(‘readcount’))

排序函数

升序语法:order_by(‘字段名’)
降序语法:order_by(’-字段名’)
例子:BookInfo.objects.all().order_by(‘readcount’)

关联查询

主表查从表语法:主表模型.关联模型类名小写_set.all()
例子:

book = BookInfo.objects.get(id=1)
book.peopleinfo_set.all()

从表查主表语法:从表模型.外键.
例子:

person = PeopleInfo.objects.get(id=1)
person.book_id

过滤语法:关联模型类名小写__属性名__条件运算符=值
例子:

book = BookInfo.objects.filter(peopleinfo__description__contains='八')

查询集QuerySet

当调用如下过滤器方法时,Django会返回查询集(而不是简单的列表):

  • all():返回所有数据。
  • filter():返回满足条件的数据。
  • exclude():返回满足条件之外的数据。
  • order_by():对结果进行排序。
  1. 特性
    -) 惰性执行
    创建查询集不会访问数据库,直到调用数据时,才会访问数据库,调用数据的情况包括迭代、序列化、与if合用

    -) 缓存
    使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。

  2. 限制查询集
    -)可以对查询集进行取下标或切片操作,等同于sql中的limit和offset子句。注意: 不支持负数索引。
    -)如果获取一个对象,直接使用[0],等同于[0:1].get(),但是如果没有数据,[0]引发IndexError异常,[0:1].get()如果没有数据引发DoesNotExist异常。

  3. 分页

    #查询数据
    books = BookInfo.objects.all()
    #导入分页类
    from django.core.paginator import Paginator
    #创建分页实例
    paginator=Paginator(books,2)
    #获取指定页码的数据
    page_skus = paginator.page(1)
    #获取分页数据
    total_page=paginator.num_pages
    

你可能感兴趣的:(学习笔记,数据库,python,django,mysql)