首页 > 其他分享 >Django入门到放弃之ORM单表操作

Django入门到放弃之ORM单表操作

时间:2022-08-27 22:45:50浏览次数:133  
标签:Book name objects models queryset Django filter ORM 单表

1.常用和非常用字段和参数概览

# 常用字段
	-IntegerField   整数
    -AutoField
    -BooleanField
    -CharField
    -DateField
    -DateTimeField
    -DecimalField
    -FileField   上传文件,本质是varchar
    -ImageField   图片,本质是varchar,继承了FileField
    -TextField   存大文本
    -EmailField   本质是varchar
# 非常用字段
	-BigAutoField
    -SmallIntegerField   
    -PositiveSmallIntegerField
    -PositiveIntegerField
    -BigIntegerField
    
    
            'AutoField': 'integer AUTO_INCREMENT',
            'BigAutoField': 'bigint AUTO_INCREMENT',
            'BinaryField': 'longblob',
            'BooleanField': 'bool',
            'CharField': 'varchar(%(max_length)s)',
            'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
            'DateField': 'date',
            'DateTimeField': 'datetime',
            'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
            'DurationField': 'bigint',
            'FileField': 'varchar(%(max_length)s)',
            'FilePathField': 'varchar(%(max_length)s)',
            'FloatField': 'double precision',
            'IntegerField': 'integer',
            'BigIntegerField': 'bigint',
            'IPAddressField': 'char(15)',
            'GenericIPAddressField': 'char(39)',
            'NullBooleanField': 'bool',
            'OneToOneField': 'integer',
            'PositiveIntegerField': 'integer UNSIGNED',
            'PositiveSmallIntegerField': 'smallint UNSIGNED',
            'SlugField': 'varchar(%(max_length)s)',
            'SmallIntegerField': 'smallint',
            'TextField': 'longtext',
            'TimeField': 'time',
            'UUIDField': 'char(32)',
                
# 常用参数
	-null
    -max_length
    -default
    -primary_key 
    -unique
    -db_index
    
    # 
    -choices:比较常用(后面再说)
	-blank: django admin里提交数据是否可以为空
    -verbose_name:在字段中则自定义字段在admin后台显示的内容,在meta中则定义表在admin后台显示的内容
    -help_text: 字段的帮助信息
        

元数据

# 元数据
	-必须记住的
    class Meta: 
            # 表名
        db_table = "book"
        ordering=('id', )    #使用id作为排序字段 ordering=('-id', ) -表示降序  因为orm获取数据有limit 21限制,在分页器时需要指定
        #联合索引
        index_together = [
            ("name", "publish"),
        ]
        # 联合唯一索引
        unique_together = (("name", "publish"),)
        
   -了解
	    # admin中显示的表名称
        verbose_name='图书表'
        #verbose_name加s
        verbose_name_plural='图书表'
        #字段显示中文
        title = models.CharField(max_length=32,verbose_name="标题")

3.打印原生sql

settings配置文件添加以下配置
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

4.增

创建记录方式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='xiangxixxx',
            age = 10,
        )
        objs_list.append(obj)

    models.Student.objects.bulk_create(objs_list,100) #每次插入100条

创建方法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')
    

5.删

    # 删除的两种方式
    # 第一种:queryset的delete方法
    # res=models.Book.objects.all().delete()
    # print(res)
    # 第二种:对象自己的delete方法
    # book = models.Book.objects.all().filter(name='金x梅').first()
    # print(type(book))
    # res=book.delete()

6.改

更新 update方法 model对象不能调用更新方法 报错信息'Student' object has no attribute 'update'只能queryset调用,如
 # 第一种:queryset的update方法
    models.Student.objects.get(name='红旭妹妹').update(age=38)
    models.Student.objects.filter(name='红旭妹妹').update(age=38)
 # 第二种:对象自己的,直接赋值
    book = models.Book.objects.filter(name='xxx').last()
    book.name='asdfasd'
    book.save()
    

7.简单查

查询所有的数据  .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

8.查询接口

<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类型,是行记录对象,返回结果有且只有一个,
                            如果符合筛选条件的对象超过一个或者没有都会抛出错误。捕获异常try。  Book.objects.get(id=1)
  
<4> exclude(**kwargs):      排除的意思,它包含了与所给筛选条件不匹配的对象,没有不等于的操作昂,用这个exclude,返回值是queryset类型 Book.objects.exclude(id=6),返回id不等于6的所有的对象,或者在queryset基础上调用,Book.objects.all().exclude(id=6)
    # exclude(**kwargs): 排除,objects控制器和queryset集合都可以调用,返回结果是queryset类型
    # query = models.Student.objects.exclude(id=1)
    # print(query)
    # query = models.Student.objects.filter(age=38).exclude(id=6)
    # print(query)
                 
<5> order_by(*field):       queryset类型的数据来调用,对查询结果排序,默认是按照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类型的数据来调用,对查询结果反向排序,返回值还是queryset类型
			# 排序之后反转
  		    # query = models.Student.objects.all().order_by('id').reverse()
    		# print(query)

<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)
	

9.基于双下划线的模糊查询

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数据库才会有这个问题,其他数据库没有这个问题。

10.python脚本中调用django环境

# 在脚本中调用djagno服务 不启动Django就可以执行表模型增删改查操作 celery中可以使用
import os
if __name__ == '__main__':
    #1  引入django配置文件
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
    # 2 让djagno启动
    import django
    django.setup()
    # 3 使用表模型
    from app01 import models
    models.Book.objects.create(name='测试书籍',publish='xx出版社')

  

标签:Book,name,objects,models,queryset,Django,filter,ORM,单表
From: https://www.cnblogs.com/panwenbin-logs/p/16631691.html

相关文章

  • Django入门到放弃之模板及标签
    1.django模板使用的两种方式#方式一 returnrender(request,'time.html',context={'current_date':str(now),'title':'lqzNB'})#方式二(页面静态化,提高网站并发量)......
  • Django入门到放弃之常见配置及基本命令
    1.基本命令1.新建一个djangoproject django-admin.pystartprojectproject_name 特别是在windows上,如果报错,尝试用django-admin代替django-admin.py试试 2......
  • Django框架  快速查询目录
    Django框架 快速查询目录 django中前后端传输数据的编码格式(contentType)django中的中间件django中的cookie和sessiondjango中的csrf跨站请求伪造django中视图函数......
  • vim在切换normal mode和insert mode 时反复切换输入法的解决办法
    vscodevim的配置切换输入法今天在用vscode写(水)一个暑研论文的时候,用的是还没用多久的vim输入方式,vim的最大优点就是移动光标的多种方式可以最大程度减少对方向键或者是鼠......
  • 小记 【django git python】
    迁移此处生成的迁移文件包含了所有的表结构(已创建和未创建的表)pythonmanage.pymakemigrationsapp_namepythonmanage.pymigrate--fake-initial--fake-initial的......
  • 【Unity学习笔记】Transform—游戏物体的缩放和看向
    1.缩放相关usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;publicclassLesson8:MonoBehaviour{voidStart(){......
  • [Django]-前言
    一、PythonWEB框架Python作为当前最流行的解释型编程语言之一,除了丰富的内置模块和第三方模块支持快速开发外,也支持Web开发,与模块类似,Python的WEB开发有很多Web框架。如......
  • 谈谈form-data请求格式
    最近一直都比较忙,坚持月月更新博客的计划不得中止了,今天抽出点时间来说说最近项目中遇到的一个问题,有关requestpost请求格式中的multipart/form-data格式。引言最近在参......
  • 界面控件DevExpress WinForms & WPF v22.2——全新的.NET和ARM支持
    DevExpressWinForm拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能完美构建流畅、美观且易于使用的应用程序,无论是Office......
  • django2.x -- auth模块的authenticate方法一直返回None,认证不成功
    创建用户时是否使用的是create_user在账号注册的时候,要用objects.create_user()函数,create()是明文存储create_user()这个函数会将密码自动加密,密文存储,加密规则“pbkdf......