Django -- 单表操作

ORM简介

1, ORM是 对象--关系--映射 的简称.实现了数据模型与数据库的解耦,即数据库的设计不需要依赖特定的数据库,通过简单的配置就可以轻松更换数据库

2, 类对象 --> sql --> pymysql --> mysql服务端 --> 磁盘,orm其实就是将类对象的语法翻译成sql语句的一个引擎

建表操作

1, 创建表

# app 应用下的 models.py 文件中写
from django.db import models
class UserInfo(models.Model):  # UserInfo 为表名
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    current_date = models.DateField()

2, 更多字段和参数

字段

<1> CharField
        字符串字段, 用于较短的字符串.
        CharField 要求必须有一个参数 max_length, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.

<2> IntegerField
       用于保存一个整数.

<3> DecimalField
        一个浮点数. 必须 提供两个参数:

<4> AutoField
        一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
        自定义一个主键:my_id=models.AutoField(primary_key=True)
        如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.

参数

(1)null

如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.

(1)blank

如果为True,该字段允许不填。默认为False。
要注意,这与 null 不同。null纯粹是数据库范畴的,而 blank 是数据验证范畴的。
如果一个字段的blank=True,表单的验证将允许该字段是空值。如果字段的blank=False,该字段就是必填的。

(2)default

字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用,如果你的字段没有设置可以为空,那么将来如果我们后添加一个字段,这个字段就要给一个default值

(3)primary_key

如果为True,那么这个字段就是模型的主键。如果你没有指定任何一个字段的primary_key=True,
Django 就会自动添加一个IntegerField字段做为主键,所以除非你想覆盖默认的主键行为,
否则没必要设置任何一个字段的primary_key=True。

(4)unique

如果该值设置为 True, 这个数据字段的值在整张表中必须是唯一的

(5)choices
由二元组组成的一个可迭代对象(例如,列表或元组),用来给字段提供选择项。 如果设置了choices ,默认的表单将是一个选择框而不是标准的文本框,<br>而且这个选择框的选项就是choices 中的选项。
(6)db_index
  如果db_index=True 则代表着为此字段设置数据库索引。
?
DatetimeField、DateField、TimeField这个三个时间字段,都可以设置如下属性。
?
(7)auto_now_add
    配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
?
(8)auto_now
    配置上auto_now=True,每次更新数据记录的时候会更新该字段,标识这条记录最后一次的修改时间

3, settings配置

若想将模型转为mysql数据库中的表,需要在 settings.py 中配置:

DATABASES = {
    ‘default‘: {
        ‘ENGINE‘: ‘django.db.backends.mysql‘,
        ‘NAME‘:‘库名‘,
        ‘USER‘:‘root‘,
        ‘PASSWORD‘:‘666‘,
        ‘HOST‘:‘127.0.0.1‘,
        ‘PORT‘:3306
    }
}
?
# 打印sql语句
LOGGING = {
    ‘version‘: 1,
    ‘disable_existing_loggers‘: False,
    ‘handlers‘: {
        ‘console‘:{
            ‘level‘:‘DEBUG‘,
            ‘class‘:‘logging.StreamHandler‘,
        },
    },
    ‘loggers‘: {
        ‘django.db.backends‘: {
            ‘handlers‘: [‘console‘],
            ‘propagate‘: True,
            ‘level‘:‘DEBUG‘,
        },
    }
}

项目文件夹下的 init.py文件中,写下面两句

import pymysql
pymysql.install_as_MySQLdb()

执行数据库同步指令

python manage.py makemigrations  # 生成记录,每次修改了models里面的内容或者添加了新的app,新的app里面写了models里面的内容,都要执行这两条
?
python manage.py migrate     # 执行上面这个语句的记录来创建表,生成的表名字前面会自带应用的名字,例如:你的book表在mysql里面叫做app01_book表

增加数据

已建好的表数据(model.py) :

from django.db import models
?
class Data(models.Model):
    name = models.CharField(max_length=10)
    age = models.IntegerField()
    current_data = models.DateField()
?
    def __str__(self):
         return self.name

1, 创建方式一:

from app import models
student_obj = models.Data(
    name = ‘alex‘,
    age = 73,
    current_data= ‘2008-08-08‘
)
student_obj.save()

2, 创建方式二(常用此创建):

from app import models
new_obj = models.Data.objects.create(
    name = ‘wusir‘,
    age = 83,
    current_data= ‘2008-08-15‘,
)
?
print(new_obj)   # Data object --> model对象
print(new_obj.name,new_obj.age)  # .属性  可以获取对应字段的数据

3, 创建方式三

from app import models
lis = []
for i in range(10):
    obj = models.Data(
        name = ‘xin‘,
        age = 18,
        current_data= ‘2010-10-10‘
    )
    lis.append(obj)
    models.Data.objects.bulk_create(lis)   # 批量插入,速度快

4, 创建方式四: update_or_create 有就更新,没有就创建

from app import models
models.Data.objects.update_or_create(
    name = ‘taibai‘,   # 有就更新
    defaults={‘age‘:89,‘current_data‘:‘2011-11-11‘}
?
    name = ‘xuefei‘,   # 没有就创建
    defaults={‘age‘:18,‘current_data‘:‘2000-08-08‘}
) 

查询数据

1, 简单查询

# all() 查询所有的数据,返回的是queryset集合
    all_objs = models.Data.objects.all()
    print(all_objs)
    for i in all_objs:
        print(i.name)   # 拿到每一个名字
?
# 条件查询: filter()方法, 返回的也是queryset集合,查询不到内容不会报错,返回一个<QuerySet []>空的queryset
    objs = models.Data.objects.filter(id=15)
    print(objs[0].name,objs[1].age)  # 通过索引.字段取值
?
    objs = models.Data.objects.filter(id=1,name=‘alex‘).update(name=‘eva‘,age=20)
    print(objs)
?
    打散的形式传参
    objs = models.Data.objects.filter(**{‘id‘:15,‘name‘:‘xuefei‘})
    print(objs)
?
# 条件查询 : get()方法,返回的是model对象,而且get方法有且必须只有一个结果
    objs = models.Data.objects.get(id=15)
    print(objs)
    查询的数据不存在会报错,得到的结果有两个时会报错
?
# exclude(**kwargs):排除的意思,包含了与所给筛选条件不匹配的对象,没有不等于操作, objects控制器和queryset集合都可以调用,返回值是queryset类型.
    ex = models.Data.objects.exclude(name=‘xin‘)
    ex = models.Data.objects.all().exclude(name=‘xin‘)
    print(ex)
?
# order_by(): queryset类型的数据来调用,查询结果进行排序,默认是按照id的升序排序的,返回值还是queryset类型,在字段前面加个 - 号,就是降序排序
    ord = models.Data.objects.order_by(‘-age‘,‘id‘) # 多条件排序,按照age进行降序,age相同的按照id升序排序
    print(ord)
?
# reverse() : queryset类型的数据来调用,对查询结果反向排序,返回值还是queryset类型
    rev = models.Data.objects.order_by(‘id‘).reverse()
    print(rev)
?
# count() : queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
    con = models.Data.objects.all().count()
    print(con)
?
# first() : queryset类型的数据来调用,返回第一条记录,得到的都是model对象
    obj = models.Data.objects.all().first()
    print(obj)
?
# last(): queryset类型的数据来调用,返回最后一条记录,结果为model对象类型
    obj = models.Data.objects.all().last()
    print(obj)
?
# exists() : queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False,空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits
?
# values(*field) : 用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列,model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。
# values_list(*field):   它与values()非常相似,它返回的是一个元组序列
    obj = models.Data.objects.all().filter(age=16).values(‘name‘,‘age‘)
    print(obj)
    obj = models.Data.objects.all().filter(age=16).values_list(‘name‘,‘age‘)
    print(obj)
?
# distinct(): values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,结果还是queryset
    query = models.Data.objects.all().values(‘age‘).distinct()
    print(query)

2, 基于双下划线的模糊查询 

mes = models.Data.objects.filter(price__in=[100,200,300]) # price值等于这三个里面的任意一个的对象
?
mes = models.Data.objects.filter(price__gt=100)  # 大于,大于等于是price__gte=100,别写price>100,这种参数不支持
?
mes = models.Data.objects.filter(price__lt=100) # 小于
?
mes = models.Data.objects.filter(price__range=[100,200])  # sql的between and,大于等于100,小于等于200
?
mes = models.Data.objects.filter(title__contains="python")  #title值中包含python的
?
mes = models.Data.objects.filter(title__icontains="python") #不区分大小写
?
mes = models.Data.objects.filter(title__startswith="py") #以什么开头,istartswith  不区分大小写
?
all_books = models.Book.objects.filter(pub_date__year=2012) #找2012年的所有书籍
?
all_books = models.Book.objects.filter(pub_date__year__gt=2012) # 找大于2012年的所有书籍
?
all_books = models.Book.objects.filter(pub_date__year=2019,pub_date__month=2) #找2019年月份的所有书籍

删除数据

delete  queryset 和model对象都可以调用
?
models.Student.objects.get(id=3).delete()  # model对象来调用的delete方法
models.Student.objects.filter(name=‘Alex‘).delete()
models.Student.objects.all().delete()  # 删除所有

更改数据

model对象不能调用更新方法 报错信息‘Student‘ object has no attribute ‘update‘
只能queryset调用
?
models.Student.objects.get(name=‘alex‘).update(age=38)  # 报错
models.Student.objects.filter(name=‘alex‘).update(age=38)

原文地址:https://www.cnblogs.com/wenxin1120/p/11259571.html

时间: 2024-07-31 02:39:01

Django -- 单表操作的相关文章

django单表操作

Django开发:(3.1)ORM:单表操作

MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动 ORM是"对象-关系-映射"的简称. Mysql中的表对应python中的类,表的字段对应类的属性,表的记录对应类的实例化的对象 单表操作 创建表 1. 创建模型 创建名为app01的app,在app01下的models.py中创建模型: from dj

Django框架05 /orm单表操作

目录 Django框架05 /orm单表操作 昨日内容回顾 今日内容 orm单表操作 对象关系映射(object relational mapping) 1.orm介绍 2.增: 3.时间问题 4.删 5.改 6.批量插入 -- bulk_create 7.查询api 8.基于双下划线的模糊查询 -- filter双下划线查询 9.总结 总结1 总结2 Django框架05 /orm单表操作 昨日内容回顾 模板相关 模板继承(母版继承) 1. 创建一个xx.html页面(作为母版,其他页面来继承

Django基础五之django模型层(一)单表操作

目录 一 ORM简介 二 单表操作 一.创建表 创建模型 2 更多字段和参数 3 settings配置 4.自定义字段(了解) 二.添加表纪录 方式1 方式2(用的多) 方式3:批量插入 三.查询表纪录 查询API(都是重点) 基于双下划线的模糊查询 四.删除表纪录 五.修改表纪录 三 章节作业 1 图书管理系统 2 查询操作练习 四 xxx 本节目录 一 ORM简介 MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,

Django模型层之单表操作

Django模型层之单表操作 一 .ORM简介 我们在使用Django框架开发web应用的过程中,不可避免地会涉及到数据的管理操作(如增.删.改.查),而一旦谈到数据的管理操作,就需要用到数据库管理软件,例如mysql.oracle.Microsoft SQL Server等. 如果应用程序需要操作数据(比如将用户注册信息永久存放起来),那么我们需要在应用程序中编写原生sql语句,然后使用pymysql模块远程操作mysql数据库,详见图一^①^ 但是直接编写原生sql语句会存在两方面的问题,严

17-2 orm单表操作和多表操作

参考:https://www.cnblogs.com/liwenzhou/p/8660826.html 一  ORM单表操作 1 增删改查 1 1. 查询 2 1. 查所有 3 models.Publisher.objects.all() 4 2. 查某个具体的记录 5 models.Publisher.objects.get(id=1) --> 注意查询条件不成立就报错 6 2. 删除一条记录 7 models.Publisher.objects.get(id=1).delete() 8 3.

母版,单表操作

上节回顾:(模板层) 1 模板之变量---{{ }} -支持数字,字符串,布尔类型,列表,字典---相当于对它进行了打印 -函数--->相当于加括号运行(不能传参数) -对象--->内存地址,(如果重写__str__方法,打印的就是返回的内容) 2 过滤器 -length---计算长度 -default----设默认值 -filesizeformat---把数字转成文件大小格式 -截断字符---最少是三 -截断单词 -data----格式化日期类型 -add-----数字,字符串相加 -sli

model,单表操作

一. model Django提供了一个抽象层(“Model”)来构建和管理Web应用程序的数据. django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 关系对象映射(Object Relational Mapping,简称ORM),  它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需要面对因数据库变更而导致的无效劳动. 二. 单表操作 <一>. 表的创建

学习MySQL之单表操作(二)

##单表操作 ##创建表 CREATE TABLE t_employee( empno INT(11), ename VARCHAR(20), job VARCHAR(40), MGR INT(11), Hiredate DATE DEFAULT '0000-00-00', sal DOUBLE(10,2), comm DOUBLE(10,2), deptno INT(11), UNIQUE INDEX uk_empno(empno) ##使用唯一索引 ); ##增 INSERT INTO t_