Django 基础(三)——基于单表的 Model 层操作

一、Model层开发过程

1.安装驱动模块
pip install mysqlclient
2.数据库配置

在项目的 settings.py 文件中找到 DATABASES 配置项,将其信息修改为:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',     # 数据库引擎
        'NAME': 'test',                           # 数据库名
        'USER': 'root',						    # 用户名
        'PASSWORD': '123456',					# 密码
        'HOST':'localhost',						# 主机ip
        'PORT':3306,						    # 端口号
    }
}  
3.创建并安装APP
  • Django规定,如果要使用模型,必须要创建一个app(以 userapp 举例):
python manage.py startapp userapp
  • 安装App 在settings.py文件中
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'userapp',                       # 创建的app名
]
4.定义Model类

在App目录下的Models.py文件中,添加Model类:

class User(models.Model):
    name = models.CharField(max_length=30)
    age = models.IntegerField()
    salary=models.DecimalField(max_digits=7,decimal_places=2)
    class Meta:
        db_table = 't_user' #自定义数据表名
5.生成迁移文件记录(pycharm 终端窗口)
python manage.py makemigrations            # 生成迁移记录
6.执行迁移操作(pycharm 终端窗口,紧接上一步)
python manage.py migrate                   # 执行迁移操作--应用到数据库

二、模型字段

1.基础字段类型
字段类型说明
AutoField一般不直接使用,Model中默认的主键类型。
如果自己没定义,Django默认给每个Model一个主键字段id。
CharFieldmax_length是必填属性。varchar
IntegerField4字节。int
DecimalFieldmax_digits(必填):共有几位数;
decimal_places(必填):小数占几位。decimal
DateField可选:auto_now=True 可做修改时间记录
可选:auto_now_add=True 可做首次添加时间
注意:以上两属性之一指定后,该字段不允许被编辑。
BooleanField接受“True/False”。tinyint
NullBooleanField接受“True/False/None”。 tinyint
2.其它字段类型
字段类型说明
SmallIntegerField2字节。smallint
BigIntegerField8字节。bigint
FloatField不如 decimal 类型精确。double
TextFieldlongtext
DateTimeFielddatetime
TimeFieldtime
ForeignKeyForeignKey(to=关系对方的类或类名或‘self’,on_delete=级联选项) 。
一对多关联关系要用到。
OneToOneFieldOneToOneFiled(to=关系对方的类或类名或‘self’,on_delete=级联选项)。
一对一关联关系要用到。
ManyToManyFieldManyToManyField(to=关系对方的类或类名或‘self’) 。
多对多关联关系要用到。
ImageField向服务器上传文件要用到。参数有upload_to:指定该文件要存放的子目录。
3.字段参数
字段类型说明
null默认为False,表示该字段不能为空。
default定义默认值,是django的约定,必须通过python代码才能在数据库上产生效果。
unique列值是否唯一。选填“Ture/False”。
primary_key默认自动创建 id字段,为主键。选填“Ture/False”。
db_column自定义列名,默认与 field 同名。
db_index是否在该列建立索引。
blank默认False,用于前端页面的form验证。
4.元数据Meta

模型的元数据,指的是“除了字段外的所有内容”,例如排序方式、数据库表名等等。

  • db_table = ‘xxx’ 设置表名(修改django默认生成的表名)
  • unique_together = ((‘列名1’,‘列名2’),(…)) 设置联合约束
  • ordering = [‘列名1’] 或 [‘列名1’,‘列名2’]

三、增删改查

1.Model Manager QuerySet
  • 每个Model类都有一个默认的manager实例,名为objects。

  • 对数据库中对象的检索, 是通过 model Manager 来构造一个 QuerySet 对象来实现。

  • manager 可理解为对QuerySet进行管理的一个类,可以通过manager的一些方法获取到QuerySet集合(可遍历)。

2.增加数据(两种方法任选其一)

Mysql语句"insert into tablename(name,age,salary) values (“liubei”,18,100) "在Django中 对应代码:

 user=User(name='liubei',age=18,salary=100)
 user.save() 
 User.objects.create(name='liubei',age=18,salary=100)
3.删除数据

delete from tablename where id = 1

 User.objects.get(pk=1).delete()
4.修改数据

update tablename set name=“zhangfei” where age=18

 user=User.objects.get(age=18)
 user.name='zhangfei'
 user.save()
5.查询数据

'User.objeccts’返回的是manager实例对象,
'User.objects.方法名()返回需要的结果。

  • 基本操作
 User.objects.all() #返回数据库中所有记录对应的User类对象的QuerySet集合。
 
 User.objects.get(pk=1)  #返回数据库中id为1记录对应的User类对象
 
 User.objects.filter() #等同于User.objects.all(),但是可以加条件
 
 User.objects.filter(pk=1)  #返回数据库中id为1记录对应的User类对象的QuerySet集合,
 #对比get()方法:即使在数据库库中找不到符合条件的记录,也不会报错,而是返回Null。
 
 User.objects.count() #返回int型,值为数据库中所有记录的条数 
 User.objects.all().count() #与上一行效果相同
 
 User.objects.exclude(pk=1) #返回除id=1外的其他记录对应的User类对象的QuerySet集合。

 User.objects.first() #返回数据库中第一条记录对应的User类对象
 User.objects.last() #返回数据库中最后一条记录对应的User类对象

 User.objects.exists() #判断表中是否有记录,返回 True 或 False
  • order_by排序
 User.objects.order_by('-age') #返回数据库中所有的记录按age降序后的QuerySet集合

 User.objects.order_by('age') #按年龄升序

 User.objects.filter(age=18).order_by('age','-name') #筛选出age为18的记录,先按age升序,如果age相同,就按name降序(ASCII码)
  • 条件查询
 User.objects.filter(pk__lt=5) #双下划线。lt:小于;  gt:大于;  lte:小于等于
  • 模糊查询
    contains、icontains:包含、包含(对大小写不敏感–i表示忽略)——“%xx%”
    startswith、istartswith:以…开始—— “xx%”
    endswith、iendswith:以…结尾——"%xx"
User.objects.filter(name__contains='i')

User.objects.filter(name__startswith='l')

User.objects.filter(name__endswith='l')
  • 范围查询
 User.objects.filter(id__range=(1,3))
 User.objects.filter(id__in=(1,2,3)) #与上一行效果相同
  • 空值查询
 User.objects.filter(age__isnull=True)
  • 映射查询
 User.objects.values() #返回QuerySet对象,包含的元素都是dict
 
 User.objects.filter(id__lt=4).values('pk')
 
 User.objects.values('pk')
 
 =User.objects.only('pk').values('pk') #only返回QuerySet对象。延缓查询
  • 聚合查询
 from django.db.models import Count, Max,Avg,Min,Sum
 
 User.objects.filter(pk__lt=5).aggregate(Max('pk')) #aggregate返回一个字典,条目的键为'pk__max'(取决于aggregate方法传入的参数),值为聚合后的结果
 
 User.objects.filter(pk__lt=5).aggregate(m=Max('pk')) #起别名m,返回字典的键为m
  • 分组查询
 from django.db.models import Count,Max,Avg,Min,Sum
 
 User.objects.values('age').annotate(Max('salary'))  #将vlaues()中的列作为分组条件时的列
 # select age,Count(age) from t_user group by age
 
 User.objects.values('age','id').annotate(Max('salary')) #values()中有两个字段,则两字段都相同才为一个组,即联合唯一,分组后再根据annotate()方法中的字段做统计操作
 
 User.objects.values('age').annotate(Count('salary')) 
 
 User.objects.filter(age__lt=4).values('age').annotate(Count('salary'))#可以先筛选再分组
 
 User.objects.values('age').annotate(s=Sum('salary'))
 
 #以下三种写法返回结果相同
 User.objects.filter(age__lt=30).values('age').annotate(s=Sum('salary')).filter(s__gt=100) 
 User.objects.values('age').filter(age__lt=30).annotate(s=Sum('salary')).filter(s__gt=100)
 User.objects.values('age').annotate(s=Sum('salary')).filter(age__lt=30).filter(s__gt=100)
  • F()和Q()函数
from django.db.models import  F, Q

User.objects.filter(id__lt=F('age')) #当查询条件中需要另外的列时,可以使用F,例如查询满足"id<age"的记录。

User.objects.filter(Q(id=3)|Q(age=25)) #当需要 “或 (|) 非(~)” 逻辑时,可以使用Q

User.objects.filter(Q(id=3)|~Q(age=25)) 

User.objects.filter(Q(id=3),~Q(age=25)) #‘,’连接表示 ‘且’
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值