单表查询

单表查询

准备工作

创建数据库

​ 在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) # 这个字段为空的数据
posted @ 2019-11-26 17:48  边城bei  阅读(147)  评论(0编辑  收藏  举报