django基础(一)详解models层

一、ORM简介

1.1 需求
  1. python、php、Java是开发语言;mysql、sql server是数据库语言;两种语言需要实现互操作
  2. ORM是Object-Relational Mapping,对象关系映射。用于实现数据库语言和编程语言之间的映射。

1.2 映射关系

  1. 对象关系映射
python类型sql
get查询SELECT
filter查询SELECT
all查询SELECT
exclude查询SELECT
save增加UPDATE
create增加INSERT
delete删除DELETE
  1. 其他映射技术
    数据类型映射表中的属性
    类映射数据库表表
  2. 缓存优化
    ORM会直接从数据库中拿到表并直接以类的形式保存,而不是每次查询时才执行数据库的select操作。所以需要ORM中需要save。
  3. ORM技术
    Django ORM:创建Model类和定义Field字段来实现。
    SQLAlchemy(目前的通用标准)、Peewee、Storm

二、model语法

2.1 创建语法
2.1.1 案例
from django.db import models #导入django的models模块
'''
创建模型类并继承models.Model。在数据库中对应生成一张表cms_frienddb,并且具备如下字段
'''
class friendDB(models.Model):
    #friendId = models.AutoField(verbose_name="id",primary_key=True)
    #用python建表会自动创建自增的id字段
    friendName = models.CharField(verbose_name="朋友名称",max_length=50)
    friendAge = models.IntegerField(verbose_name="朋友岁数")
    friendInf = models.TextField(verbose_name="朋友介绍")
    friendMail = models.EmailField(verbose_name="朋友邮箱")
    friendImg = models.ImageField(verbose_name="朋友头像")
    sexchoice=(
        ("male","男"),
        ("female","女"),
    )
    friendSex = models.CharField(verbose_name="性别",choices=sexchoice,default="male",max_length=50)

    #定义Meta子类,为模型类添加其他说明,例如数据库表名,默认排序方式,数据库模型
    class Meta:
        verbose_name="朋友表"
        verbose_name_plural="朋友们"

    #在django提供的admin模块中,为该表中的每一个对象指定一个属性作为标签显示
    def __unicode__(self):
        return self.friendName
2.1.2 案例的说明
  1. 建了数据库的类之后需要python manage.py makemigrationsmigrate,需要进行数据迁移(数据同步)。若数据库中没有已定义的表则会直接创建,并且为每个边生成一个自增的id字段作为唯一的标识。
  2. 所有Django模型类都继承django.db.models;所以需要在models这个模块里面from django.db import models
  3. 每个models中类对应数据库中的一张表。表的名称是:appname+modelname
  4. 每个类中的filed属性对应数据表中的数据项。
  5. Meta子类用于定义一些数据库表的元数据,例如数据库表名、默认排序方式、数据库模型。
2.1.3 Field类型
  1. AutoField:一个自动递增的字段,当向数据库中添加记录时它会自动增长,通常用作该表的记录的主键。需要注意的是,通过django数据迁移所产生的表,会自动生成一个AutoField类型的’id’属性,这时候我们是无法自行添加其他AutoField类型的属性的。mysql限制每个表只能有一个AutoField类型的属性
  2. CharField:字符串字段,用于输入较短的字符串,必须指定max_length,对应html中的<input type="text">
  3. TextField:文本字段,用于输入较多的字符串,对应html中的<input type="textarea">;
  4. EmailField:邮箱字段,前端部分最好使用正则表达式检查。
  5. DateTimeField:日期字段,通常传入时间戳。
  6. ImageField:用于上传图片,需要有upload_to参数,使用本字段需要安装python pillow等图片库。
  7. IntegerField:整数字段。
2.1.4 Field属性
  1. primary_key:TrueorFalse,是否为主键
  2. default:默认值
  3. null:TrueorFalse,是否允许某字段为空。默认是False(不允许为空)。
  4. blank:TrueorFalse, 是否允许用户不输入,默认为False(用户不可以不输入这个字段)。
  5. choices:该字段的值是一个二维的元组,是(‘数据库实际存储的值’,‘HTML页面显示的值’)。
  6. max_length:最大长度,可以为CharField、TextField、EmailField设置,其中CharField必须设置该Field属性。
  7. verbose_name:设置字段的后台显示名称(不是表的属性名称)
  8. upload_to:设置上传路径,ImageFieldFileField这两种字段都需要设置。
2.1.5 Meta类属性
  1. verbose_name:设置数据库内每一个对象(每一个元组)的名称。默认值为类名的小写形式
  2. verbose_name_plural:对象名的复数形式,显示在admin页面上。
  3. db_table:设置映射的数据表明;proxy:设置本模型以及继承该模型的子模型是否为代理模型;abstract:设置本模型类是否为抽象基类。

三、数据迁移

  1. 在models中对数据库的类进行了修改。
  2. 打开manage.py Task或者直接在console窗口用python mannage.py来执行后面的命令。
  3. 执行makemigrations,Model会被扫描同时与migrations文件夹中的之前的版本进行比较,生成本次的迁移文件。
  4. 执行migrate
  5. 可以通过makemigrations appnamemigrate appname来进行特定app的数据迁移。

四、python操作数据库

4.1 常用的两种数据库
  1. mysql:也就是现在常用的Mariadb。
  2. sqlite :轻量级、可嵌入、但不能承受高并发,适合桌面和移动应用。
4.2 安装数据库驱动(以mysql为例)
  1. 在服务端成功安装数据库之后,需要为python安装mysql的驱动来连接和操作数据库。主要是这两种:mysql-connect-pythonMySQL-python。随意选择一个装,前者是mysql官方的纯python驱动,而后者是封装了c驱动的python驱动。
  2. 需要注意的是,python的DB-API定义都是通用的,所以使用sqlite和mysql时,python下操作数据库的语法是类似的。
4.3 python中数据库的查询方法
python类型sql
get查询SELECT
filter查询SELECT
all查询SELECT
exclude查询SELECT

ModelName.Objects.all():查询模型类(某张表)的所有数据。
ModelName.Objects.get():返回符合筛选条件的单个对象。
ModelName.Objects.filter():返回符合筛选条件的单个或多个对象。
ModelName.Objects.exclude():返回不符合筛选条件的数据集。

注意:上面的ModelName是在models.py中为数据库表定义的类名。

案例:

all_user = usertb.objects.all()
#查询模型类的所有数据

best_user = usertb.objects.get(id=int(user_id))#
#获取模型类的某一个对象(获取表的某一个元组)

user_course = sctb.objects.filter(id=int(user_id))
#获取模型类的多个对象(获取表的多个元组)
4.4 python中数据库的增加方法
python类型sql
save增加UPDATE
create增加INSERT

ModelName.Objects.create():为某个模型类增加一个对象。(为数据表增加一个元组)
ModelName.Objects.save():保存操作。

案例:

user_cms=UserCMS()
#做增加操作之前需要先实例化

user_cms.username="user"
user_cms.password="pass"
user_cms.save()

或者

user_cms=UserCMS.objects.create(username="user",password="pass")
comment.save()
4.5 python中数据库的增加方法
python类型sql
delete删除DELETE

ModelName.Objects.all().delete():s删除模型类(某张表)的所有数据。
ModelName.Objects.get().delete():删除符合筛选条件的单个对象。
ModelName.Objects.filter().delete():删除符合筛选条件的单个或多个对象。
ModelName.Objects.exclude().delete():删除不符合筛选条件的数据集。

deluser = UserCMS.objects.filter(username=username,password=password)
deluser.delete()

或者

UserCMS.obejects.filter(username=username,password=password).delete()
4.6 python中数据库表的排序方法

ModelName.Objects.all().order_by('xxx'):会返回根据某字段排序的模型类的所有数据。
例如:all_interviews = Interview.objects.all().order_by('-read_counts')

4.7 python中数据库表的切片方法

ModelName.Objects.all().order_by('xxx')[a;b]:在排序结果上去从a到b的对象。
例如:all_interviews = Interview.objects.all().order_by('-read_counts')[:3]

4.8其他操作

关系操作:一对一操作、一对多操作、多对得多操作。
面向对象操作:抽象类继承、多表继承、代理模型继承。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值