模型层

模型层

ORM查询

单表操作

配置测试脚本

方式一:

直接在某一个应用的tests文件中书写下面内容

import os				
if __name__ == "__main__":
	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
	import django
	django.setup()
    # 一定要等待测试脚本搭建完毕,才能导入Django进行测试
    from app01 import models

方式二:

直接新建一个任意名称的py文件,在里面也写上面的配置

import os				
if __name__ == "__main__":
	os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day53.settings")
	import django
	django.setup()
    # 一定要等待测试脚本搭建完毕,才能导入Django进行测试
    from app01 import models

数据的增删改查

#create方法
obj=models.表名.objects.create(字段名='xxx',)
#利用对象的绑定方法
obj=models.表名(字段名='xxx')
obj.save()

res = models.表名.objects.filter(pk=1)

pk会自动帮你查找到当前表的主键字段 所以后期我们都是用pk来指代主键字段filter查询出来的结果是一个Queryset对象

特点:

  1. 只要是queryset对象就可以无限制的调用queryset方法
  2. 只要是queryset对象就可以点query查看当前结果内部对应的sql语句
#方式一 利用queryset方法
models.表名.objects.filter(pk=1).update(字段名=值)

#方式二 利用对象
obj = models.表名.objects.get(pk=1)
obj.字段名 = 值
obj.save() 
# 该方法不推荐使用,推荐使用queryset方法

get和filter区别

  1. filter获取到的是一个queryset对象,类似于一个列表

  2. get获取到的直接就是数据对象本身

    当条件不存在的情况下,filter不报错直接返回一个空 (推荐使用queryset)

    get直接报错

#利用queryset方法 delete()
models.表名.objects.filter(pk=3).delete()

#对象方法
obj = models.表名.objects.get(pk=3)
obj.save()

在配置文件中配置相应的代码即可查看所有orm语句内部对应的sql语句

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. all()

查询所有,返回queryset对象

res = models.Books.objects.all()

2. filter()

筛选,相当于原生sql语句中的where关键字,返回queryset对象

res = models.Books.objects.filter(pk=1,title='三')

3. get()

筛选,获取的是数据对象本身,条件不存在直接报错,查询条件必须唯一

res = models.Books.objects.get(title='西游记')

4. first()

取queryset对象中第一个数据对象

res = models.Books.objects.filter(title='西游记').first()

5.last()

取queryset对象中最后一个数据对象

res = models.Books.objects.filter(title='西游记').last()

6. count()

统计数据的个数

res = models.Books.objects.count()

7. values()

获取数据对象中指定的字段的值,可以有多个,返回的是列表套字典

res = models.Books.objects.values('title','price')

8. values_list()

获取数据对象中指定的字段的值,可以有多个,返回的是列表套元祖

res = models.Books.objects.values_list('title','price')

9. order_by()

按照指定的字段排序,默认是升序,如果要降序就在字段前面加负号

res1 = models.Books.objects.all().order_by('price')

10.reverse()

颠倒顺序,颠倒的对象必须有顺序

res3 = models.Books.objects.all().order_by('price').reverse()

11. exclude()

排除什么什么之外 返回的是queryset对象

res = models.Books.objects.all().exclude(title='三国演义')

12.exists()

判断查询结果是否有值,返回一个布尔值

res = models.Books.objects.filter(pk=1).exists()

13. dixtinct()

对查询结果进行去重

res = models.Books.objects.values('title','price').distinct()

双下划线查询

#查询价格大于500的书籍
res = models.Books.objects.filter(price__gt=500)
#查询价格小于400 的书籍
res = models.Books.objects.filter(price__lt=400)
#查询价格大于等于500
res = models.Books.objects.filter(price__gte=444.66)  对数字精确度不敏感
res = models.Books.objects.filter(price__gte=500)
#查询价格小于等于500的书籍
res = models.Books.objects.filter(price__lte=500)
#查询价格是222.66或者444.22或者500的书籍
res = models.Books.objects.filter(price__in=[222,444,500])
#查询价格在200到800之间的书籍
res = models.Books.objects.filter(price__range=(200,800))  # 顾头顾尾
#查询出版日期是2019年的书籍
res = models.Books.objects.filter(publish_date__year='2019')
#查询出版日期是1月份的书籍
res = models.Books.objects.filter(publish_date__month='1')

模糊查询

#查询书籍是以三开头的书
res = models.Books.objects.filter(title__startswith='三')
#查询书籍是以义结尾的书
res = models.Books.objects.filter(title__endswith='1')
#查询书籍名称中包含游字的书籍
res = models.Books.objects.filter(title__contains='游')
#查询书籍名称中包含字母p的书籍
res = models.Books.objects.filter(title__contains='p')  # 默认区分大小写
res = models.Books.objects.filter(title__icontains='p')  # 忽略大小写 加i

一对多字段数据的增删改查

#第一种  直接传表里实际的数据,跟数据主键值
models.Book.object.create(title='xxx',price=213,publish_id=1)

#第二种 传虚拟字段,跟数据对象即可
publish_obj= models.Publish.objects.filter(pk=2).first()
models.Book.objecets.create(title='sss',price=123,publish=publish_obj)

#第一种 
models.Book.objects.filter(pk=1).update(publish_id=2)

#第二种
publish_obj = models.Publish.objects.filter(pk=1).first()
models.Book.objects.filter(pk=1).update(publish=publish_obj)

models.Publish.objects.filter(pk=1).delete() #默认联级删除

多对多字段数据的增删改查

# 方法一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.add(1) #在第三张表里给书籍绑定一个主键为1的作着

#方法二
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.add(author_obj)

#add方法 能够朝第三张关系表添加数据,既支持数字,也支持对象,都可以是多个

# 方法一
book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.set((1,3))

#方法二
author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.set((author_obj))

#set修改多对多关系表中的数据,既可以传数字也可以传对象,但是需要注意的是括号内必须是可迭代对象,都支持多个

book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.remove(1,2)

author_obj = models.Author.objects.filter(pk=1).first()
book_obj.authors.remove(author_obj)
# remove既可以传数字 也可以穿对象 并且都支持传多个 不需要迭代

清空

book_obj = models.Book.objects.filter(pk=2).first()
book_obj.authors.clear()
# clear清空书籍相关所有记录  括号内不需要传递参数 

跨表查询

正反向查询

关系字段在谁哪 由谁查谁就是正向

如果关系字段 就是反向

正向查询按字段

反向查询按表名小写 + _set

当正向查询点击外键字段数据有多个的情况下 需要.all()

原文地址:https://www.cnblogs.com/shin09/p/11970968.html