Django入门到放弃之ORM单表操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | # 常用字段 - 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: 字段的帮助信息 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | # 元数据 - 必须记住的 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 = "标题" ) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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' , }, } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 创建记录方式 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') |
1 2 3 4 5 6 7 8 | # 删除的两种方式 # 第一种: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() |
1 2 3 4 5 6 7 8 9 | 更新 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() |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | 查询所有的数据 . 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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 | < 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) |
1 2 3 4 5 6 7 8 9 10 11 12 | 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数据库才会有这个问题,其他数据库没有这个问题。 |
1 2 3 4 5 6 7 8 9 10 11 | # 在脚本中调用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出版社' ) |
"一劳永逸" 的话,有是有的,而 "一劳永逸" 的事却极少
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
2020-08-27 Linux 五种IO模型