zoukankan      html  css  js  c++  java
  • django 单表操作

    单表操作

    1.文件配置

    应用的文件夹中的models.py文件中写

    class Student(models.Model):
    	id = models.AutoField(primary_key = True)#如果表里面没有写主键,表里面会自动生成一个自增主键字段,叫做id字段,orm要求每个表里面必须要写一个主键
    	title=models.CharField(max_length=32)  #和varchar(32)是一样的,32个字符
    	pub_date=models.DateField() #必须存这种格式"2018-12-12"
    	...
    
    

    更多字段:

    <1> CharField	#字符串字段, 用于较短的字符串.
            CharField 要求必须有一个参数 maxlength, 用于从数据库层和Django校验层限制该字段所允许的最大字符数.
            
    <2> IntegerField	#用于保存一个整数.
    
    <4> AutoField
            一个 IntegerField, 添加记录时它会自动增长. 你通常不需要直接使用这个字段;
            自定义一个主键:my_id=models.AutoField(primary_key=True)
            如果你不指定主键的话,系统会自动添加一个主键字段到你的 model.
    

    更多参数:

    (1)null		#如果为True,Django 将用NULL 来在数据库中存储空值。 默认值是 False.
    (2)default	#字段的默认值。可以是一个值或者可调用对象。如果可调用 ,每有新对象被创建它都会被调用,如果你的字段没有设置可以为空,那么将来如果我们后添加一个字段,这个字段就要给一个default值
    

    数据库同步指令

    python manage.py makemigrations	#生成记录
    ptthon manage.py migrate	#执行上面这个语句的记录来创建数据库表
    

    settings文件中

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME':'bms',           # 要连接的数据库,连接前需要创建好
            'USER':'root',        # 连接数据库的用户名
            'PASSWORD':'',        # 连接数据库的密码
            'HOST':'127.0.0.1',       # 连接主机,默认本级
            'PORT':3306            #  端口 默认3306
        }
    }
    

    项目的init文件中

    import pymysql
    pymysql.install_as_MySQLdb()
    
    

    2.ORM单表操作

    类 --- 表
    类对象 --- 一行数据
    类属性 --- 表的字段
    
    • 首先想操作表的增删改查,你需要导入这个表

    • class Student(models.Model):
      	name = models.AutoField(primary_key = True)
      	age = models.IntegerField()
      

    2.1增

    • 一个一个增加
    • 批量增加
    • 有更新,没有就添加
    • 添加时间
    ##创建记录方式1
        student_obj = models.Student(
            name='dazhaung',
            age=23,
        )
        student_obj.save()
        
    ##创建记录方式2(常用)
        new_obj = models.Student.objects.create(name='xiaozhuang2',age=6) #写成 **{'name':'xx'}
        print(new_obj)  #Student object --  model对象
        print(new_obj.name)  #点属性,可以获取对应字段的数据
        print(new_obj.age)
    
    ##创建方式3 批量创建
        objs_list = []
        for i in range(100,3000000):
            obj = models.Student(
                name='xiangxi%s'%i,
                age = '10 + %s' %i,
            )
            objs_list.append(obj)
    
        models.Student.objects.bulk_create(objs_list)	#批量插入,速度快
    
    ##创建方法4  有就更新,没有就创建 update_or_create
        models.Student.objects.update_or_create(
            name='红旭妹妹2',	# 查找筛选条件
            defaults={
                'age':38,	   # 添加或者更新的数据
            }
        )
    
    ##添加日期数据
        import datetime
        current_date = datetime.datetime.now()
        # print(current_date) #2019-07-19 12:19:26.385654
    	# 两种方式
        # models.Brithday.objects.create(name='B哥',date=current_date)
        # models.Brithday.objects.create(name='得港10',date='2000-12-08')
        
    

    2.2删:

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

    2.3改

    更新 update方法 model对象不能调用更新方法 报错信息'Student' object has no attribute 'update'
        只能queryset调用,如果
        models.Student.objects.get(name='红旭妹妹').update(age=38)
        models.Student.objects.filter(name='红旭妹妹').update(age=38)
    
    

    2.4简单查

    
    查询所有的数据  .all方法 返回的是queryset集合
        all_objs = models.Student.objects.all()
        #<QuerySet [<Student: Student object>, <Student: Student object>, <Student: Student object>]> -- 类似于列表  --  queryset集合
        # for i in all_objs:
        #     print(i.name)
        print(all_objs)
    
    条件查询  .filter方法,返回的也是queryset集合,查询不到内容,不会 报错,返回一个<QuerySet []>空的queryset
        objs = models.Student.objects.filter(id=2)  #找id为2的那条记录
        print(objs) #<QuerySet [<Student: xiaozhuang>]>
        objs = models.Student.objects.filter(name='dazhaung')
        print(objs) #<QuerySet [<Student: dazhaung>]>
    
    条件查询 get方法,返回的是model对象,而且get方法有且必须只有1个结果
        obj = models.Student.objects.get(id=3)  #找id为3的那条记录
        print(obj)  #xiaozhuang2
    

    3.查询接口

    3.1查询API

    • queryset类型可以调用fitler在过滤
    <1> all():                  查询所有结果,结果是queryset类型
      
    <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,结果也是queryset类型
            
            Book.objects.filter(title='linux',price=100) #里面的多个条件用逗号分开,并且这几个条件必		须都成立,是and的关系,or关系的我们后面再学,直接在这里写是搞不定or的
    	models.Student.objects.filter(id=7,name='大壮哥哥',age=78).update(
            name='大壮禅师',
            age=78
        )
        #打伞形式传参
        models.Student.objects.filter(**{'id':7,'name':'大壮禅师'}).update(age=100)
      	models.Student.objects.all().filter(id=7)  queryset类型可以调用fitler在过滤
      
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,不是queryset类型,是行记录对象,返回结果有且只有一个,
      Book.objects.get(id=1)    如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。 
      
    <4> exclude(**kwargs):      排除,objects控制器和queryset集合都可以调用,返回结果是queryset类型
    
        # query = models.Student.objects.exclude(id=1)	返回id不等于1的所有的对象
        # print(query)
        # query = models.Student.objects.filter(age=38).exclude(id=6)
        # print(query)
    
    • queryset类型的数据来调用
    <5> order_by(*field):       对查询结果排序,默认是按照id来升序,返回值还是queryset类型
        
      models.Book.objects.all().order_by('price','id') #直接写price,默认是按照price升序排列,	按照字段降序排列,就写个负号就行了order_by('-price'),
    	order_by('price','id')#是多条件排序,按照price进行升序,price相同的数据,按照id进行升序
                   
    <6> reverse():              对查询结果反向排序,返回值还是queryset类型
    			# 排序之后反转
      		    # query = models.Student.objects.all().order_by('id').reverse()
    
    <7> count():                queryset类型的数据来调用,返回数据库中匹配查询(QuerySet)的对象数量。
      
    <8> first():                queryset类型的数据来调用,返回第一条记录
        	Book.objects.all()[0] = Book.objects.all().first(),得到的都是model对象,不是queryset
      
    <9> last():                queryset类型的数据来调用,返回最后一条记录,结果为model对象类型
      
    <10> exists():              queryset类型的数据来调用,如果QuerySet包含数据,就返回True,否则返回False
        #查询的效率高
       #空的queryset类型数据也有布尔值True和False,但是一般不用它来判断数据库里面是不是有数据,如果有大量的数据,你用它来判断,那么就需要查询出所有的数据,效率太差了,用count或者exits
       #例:all_books = models.Book.objects.all().exists() #翻译成的sql是SELECT (1) AS `a` FROM `app01_book` LIMIT 1,就是通过limit 1,取一条来看看是不是有数据
    
    <11> values(*field):        用的比较多,queryset类型的数据来调用,返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列
          #model的实例化对象,而是一个可迭代的字典序列,只要是返回的queryset类型,就可以继续链式调用queryset类型的其他的查找方法,其他方法也是一样的。
            
    <12> values_list(*field):   它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列
     
    <13> distinct():            values和values_list得到的queryset类型的数据来调用,从返回结果中剔除重复纪录,结果还是queryset
    	query = models.Student.objects.all().values('age').distinct()
        print(query)
    

    3.2基于双下划线的模糊查询

    Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象
    Book.objects.filter(price__gt=100)  #大于,大于等于是price__gte=100,别写price>100,这种参数不支持
    Book.objects.filter(price__lt=100)
    Book.objects.filter(price__range=[100,200])  #sql的between and,大于等于100,小于等于200
    Book.objects.filter(title__contains="python")  #title值中包含python的
    Book.objects.filter(title__icontains="python") #不区分大小写
    Book.objects.filter(title__startswith="py") #以什么开头,istartswith  不区分大小写
    Book.objects.filter(pub_date__year=2012)
    
    # 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年月份的所有书籍,如果明明有结果,你却查不出结果,是因为mysql数据库的时区和咱们django的时区不同导致的,了解一下就行了,你需要做的就是将django中的settings配置文件里面的USE_TZ = True改为False,就可以查到结果了,以后这个值就改为False,而且就是因为咱们用的mysql数据库才会有这个问题,其他数据库没有这个问题。
    
  • 相关阅读:
    phpStorm 安装配置
    node.js 模块之url和querystring模块
    node.js模块之util模块
    JAVA设计模式(09):结构型-代理模式(Proxy)
    VB.NET版机房收费系统---七仙女之系统登录
    Guava Collect
    win7 vs2010 安装cocos2d-x
    持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接
    安卓kernel自主唤醒系统方法—设置alarm
    JSP导出Excel文件
  • 原文地址:https://www.cnblogs.com/xiaobai686/p/12038216.html
Copyright © 2011-2022 走看看