单表查询
单表查询
准备工作
创建数据库
在cmd
里创建数据库
settings
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'orm001',
'USER':'root',
'PASSWORD':'123',
'HOST':'127.0.0.1',
'PORT':3306,
}
}
修改链接方法
项目文件夹下的init
文件中写上下面内容,用pymysql
替换mysqldb
import pymysql
pymysql.install_as_MySQLdb()
创建数据库表
models.py
class Userinfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=10)
bday = models.DateField()
checked = models.BooleanField()
# 在已经创建成功的表中添加新字段, 需要设置默认值,对应默认不为空的已经有的记录的新字段的值
# 或者在新字段的参数中设置null=True
执行命令创建
python3 manage.py makemigrations
python3 manage.py migrate
# 数据库同步指令
记录操作
创建记录
def index(request):
new_obj = models.Userinfo(
name = "张三",
bday = "1995-5-5",
checked = 1,
)
new_obj.save()
# 翻译成sql语句,然后调用pymysql,发送给服务端 insert into app01_userinfo values('张三','1995-5-5',1)
return render(request,"index.html")
增
方式一:
def index(request):
new_obj = models.Userinfo(
name = "张三",
bday = "1995-5-5",
checked = 1,
)
new_obj.save()
return render(request,"index.html")
方式二:
def index(request):
ret = models.Userinfo.objects.create(
name = "李四",
bday = "1996-6-6",
checked = 0,
)
return render(request,"index.html")
删
简单查询:filter() -- 结果是queryset类型的数据里面是一个个的model对象,类似于列表
models.UserInfo.objects.filter(id=7).delete() # queryset对象调用, 删除符合条件的所有记录
models.UserInfo.objects.filter(id=7)[0].delete() # model对象调用, 删除符合条件的记录列表的[0]索引的记录
改
方式一:
models.Userinfo.objects.filter(id=3).update(
name = "张三",
checked = 0
)
方式二:
def index(request):
ret = models.Userinfo.objects.filter(id=3)[0]
ret.name = "李四",
ret.checked = 1
ret.save()
return render(request,"index.html")
model
对象不能调用update方法
特殊:
auto_now
参数, 创建记录会自动添加创建时的时间, 但是更新时只有使用save方法的方式2才能自动更新时间
now = models.DateTimeField(auto_now=True,null=True)
时间问题
models.UserInfo.objects.create(
name='张三',
bday=current_date,
# now=current_date, 直接插入时间没有时区问题
checked=0
)
但是如果让这个字段自动来插入时间,就会有时区的问题,auto_now_add创建记录时自动添加当前创建记录时的时间,存在时区问题
now = models.DateTimeField(auto_now_add=True,null=True)
解决方法:
settings配置文件中将USE_TZ的值改为False
# USE_TZ = True
USE_TZ = False # 告诉mysql存储时间时按照当地时间来寸,不要用utc时间
使用pycharm的数据库客户端的时候,时区问题要注意
批量插入(bulk_create)
obj_list = []
for i in range(20):
obj = models.Book(
title=f'abc{i}',
price=20+i,
publish_date=f'2019-09-{i+1}',
publish='24期出版社'
)
obj_list.append(obj)
models.Book.objects.bulk_create(obj_list) #批量创建
request.POST -- querydict类型
# {'title': ['asdf '], 'price': ['212'], 'publish_date': ['2019-09-12'], 'publish': ['asdf ']}
data = request.POST.dict() -- 能够将querydict转换为普通的python字典格式
# 创建数据
models.Book.objects.create(
# title=title,
# price=price,
# publish_date=publish_date,
# publish=publish
**data
)
查询api
models.Book.objects.filter.all()
# 结果为queryset类型
models.Book.objects.filter(title='abc7',publish='24期出版社') # 多条件查询
# 查询条件不能匹配到数据时, 不会报错, 返回一个空的queryset, <QuerySet []>,如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法
models.Book.objects.get()
# 得到的是一个model对象, 有且只能有一个
# 查不到数据会报错 :Book matching query does not exist.
# 超过一个就报错 :returned more than one Book -- it returned 13!
models.Book.objects.exclude()
# 排除
# object能够调用,models.Book.objects.exclude(title__startswith='abc')
# queryset类型数据能够调用, models.Book.objects.all().exclude(title__startswith='abc')
models.Book.objects.all().order_by('-price','id')
# 排序
# 默认按照 id 来升序排列, 返回的是queryset类型,降序加"-"号
odels.Book.objects.all().order_by('id').reverse()
# 反转
# 数据排序之后才能反转
models.Book.objects.all().count()
# 计数, 统计返回结果的数量
models.Book.objects.all().first()
# 返回第一条数据, 返回值是model对象类型
models.Book.objects.all().last()
# 返回最后一条数据, 返回值是model对象类型
models.Book.objects.filter(id=9000).exists()
# 有数据返回True, 没有结果返回False
models.Book.objects.all().values()
# 返回一个valueQuerySet, 一个特殊的QuerySet, 得到的不是model实例化对象, 而是一个可迭代的字典序列
models.Book.objects.all().values_list()
# 与values相似, 它返回的是一个元组序列
models.Book.objects.all().values.distinct()
# 去重, 需要配合values或者values_list来使用
filter双下方法模糊查询
models.Book.objects.filter(price__gt=35) # 大于
models.Book.objects.filter(price__gte=35) # 大于等于
models.Book.objects.filter(price__lt=35) # 小于
models.Book.objects.filter(price__lte=35) # 小于等于
models.Book.objects.filter(price__range=[35,38]) # 大于等于35, 小于等于38
models.Book.objects.filter(title__contains='abc') # 字段数据中包含这个字符串的数据都要
models.Book.objects.filter(title__icontains='python') # 不区分大小写, 字段中包含这个字符串的数据都要
models.Book.objects.filter(title__startswith='py') # 以...开头
models.Book.objects.filter(title__istartswith='py') # 不区分大小写, 以...开头
models.Book.objects.filter(publish_date__year='2018') # 2018年的数据都要
models.Book.objects.filter(publish_date__year__gt='2018') # 年数大于2018的数据都要, 直接写数字也可以
models.Book.objects.filter(publish_date__year='2019', publish_date__month='8', publish_date__day='1') # 2019年, 8月, 1日的数据
models.Book.objects.filter(publish_date__isnull=True) # 这个字段为空的数据