首页 > 其他 > 详细

Django框架——模型(models)层之ORM查询(一)

时间:2019-10-31 19:25:52      阅读:85      评论:0      收藏:0      [点我收藏+]

一、ORM查询

1.1配置环境

如果你向查看orm语句内部真正的sql语句有两种方式
1.如果是queryset对象 可以直接点query查看
2.配置文件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,
                    },
                }}
django测试环境搭建
    import os
    if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "one_search.settings")
    import django
    django.setup()
    # 你就可以在下面测试django任何的py文件

1.2单表查询

必知必会13条

all() 查询所有
filter() 获取一个列表,里面是QuerySet对象
get() 获取数据对象本身
first() 拿第一个
last() 那最后一个
exclude() 除此之外
values() 获取一个列表套字典,QuerySet对象
values_list() 获取一个列表套元组,QuerySet对象
count() 统计数据个数
distinct() 去重(数据必须是一模一样)
order_by() 排序(默认是升序)
reverse() 反转(一定要先排序才能反转)
exists() 判断有没有数据

神奇的下划线查询

‘‘‘eg:res = models.Book.objects.filter(price__gt=200)‘‘‘
__gt 大于,__gte 大于等于
__lt 小于,__lte 小于等于
price__in=[12,25] 价格是12或者是25 ,__in 或者
price__rang=(12,25) 价格在12~25之间,顾头不顾尾。
#模糊匹配
__contains=x 包含x的
__icontains 忽略大小写

__startswith 以什么为开头
__endswith 以什么结束

__year 年,__month 月

1.3多对多字段的四个方法

#
1.add() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个
#
2.set() 括号内既可以传数字,也可以传数据对象,而且都支持一次性传多个,但是括号内必须是可迭代对象
#
3.remove() 号内既可以传数字,也可以传数据对象,而且都支持一次性传多个,
#清空
clear() 括号内不需要传任何参数 直接清空当前对象所有的记录

4.跨表查询的规律

ORM跨表查询分为子查询和连表查询

查询又分为正反向查询:
外键字段在哪个表,从那个表出发查询就是正向查询,反之为反向查询
即外键在哪个表,谁就是正向查询,没有外键就是反向查询
***正向查询按字段***
***反向查询按表名小写***

# 1.基于对象的跨表查询>>>>子查询
# eg:查询书籍是python入门的出版社名称
book_obj = models.Book.objects.filter(title=python入门).first()
#  正向查询按字段
print(book_obj.publish.name)

"""
    正向查询 按字段 
    当该字段所对应的数据有多个的时候 需要加.all()
    否则点外键字段直接就能够拿到数据对象
"""
#eg:查询出版社是东方出版社出版过的书籍
publish_obj = models.Publish.objects.filter(name=东方出版社).first()
print(publish_obj.book_set)  #出现 app01.Book.None,表示代码没问题,需要加.all()
print(publish_obj.book_set.all())

"""
    反向查询按表名小写 
        什么时候需要加_set
            当查询的结果可以是多个的情况下 需要加_set.all()
        什么时候不需要加_set
            当查询的结果有且只有一个的情况下 不需要加任何东西 直接表名小写即可
 """
#eg:查询书籍是python入门的作者的手机号
book_obj = models.Book.objects.filter(title=python入门).first()
print(book_obj.authors.all())
 # 2.基于双下划綫的跨表查询>>>>连表查询
 ‘‘‘
 跨两张表查询:
 正向查询:按关联字段+双下划线+要取的那张被关联表中的字段
 反向查询:按表名小写+双下划线+要取的那张被关联表中的字段
 ‘‘‘

‘‘‘
跨多表,连续跨
连续跨的操作的套路与两张表的一样,可以连续接n个双下划线,只需要在每次连双下划线时,确定是正向还是反向的
‘‘‘
```

"""
left join
right join
inner join
union
"""
# 正向
models.Book.objects.filter(title=‘python‘).values(‘publish__name‘)
# 写外键字段publish之后 就会跨到publish表中 你想要该表的哪个字段对应的数据 就加__字段名获取

models.Book.objecst.filter(pk=1).values(‘authors__name‘)

models.Author.objects.filter(name=‘jason‘).values(‘author_detail__addr‘)

models.Publish.objects.filter(pk=1).values(‘book__title‘)
models.authors.objects.filter(pk=1).values(‘book__title‘)
models.AuthorDetail.objects.filter(pk=1).values(‘author__name‘)


# 反向

models.Publish.objects.filter(book__title=‘python‘).values(‘name‘)



"""查询书籍id为1 的作者的 手机号"""
models.Book.objects.filter(pk=1).values(‘authors__author_detail__phone‘)

 

 

Django框架——模型(models)层之ORM查询(一)

原文:https://www.cnblogs.com/lulingjie/p/11773131.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!