zoukankan      html  css  js  c++  java
  • 单表查询

    单表查询

    准备工作

    创建数据库

    ​ 在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) # 这个字段为空的数据
    
  • 相关阅读:
    使用VMware Workstation安装win7镜像文件时遇见的错误
    每次启动懂maven项目都必须关闭javaw.exe进程
    laravel excel导出调节列宽度,对某列中数据颜色处理
    三个<li>元素放一行
    php中bootstrap框架.popover弹出框,鼠标移动到上面自动显示,离开自动消失
    锚点,自动跳转到某处
    WdatePicker控件Javascript取得当前时间、取得减30分钟时间
    (mysql数据库报错)The user specified as a definer ('root'@'%') does not exist
    c# tcp协议发送数据
    c# 键值对的方式post提交
  • 原文地址:https://www.cnblogs.com/beichen123/p/11937282.html
Copyright © 2011-2022 走看看