我的成长磨练,每天写博客,年轻人,卷起袖子,来把手弄脏吧! ------ 博客首页

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

一、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')

 

 

posted @ 2019-10-31 19:16  不喜  阅读(225)  评论(0编辑  收藏  举报