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

静态文件

在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
    在这里插入图片描述

  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
    在这里插入图片描述

数据增删改查

新增数据

  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
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值