Django微讲解(六)

Django微讲解(六)

双下划线查询

# 1.查询年龄大于50的用户
res = models.Users.objects.filter(age__gt=50)
'''
__gt:大于
__lt:小于
__gte:大于等于
__lte:小于等于
'''
# 2.查询年龄是18,28,38的用户
res = models.Users.objects.filter(age__in=[18,28,38])
# 3.查询年龄18到40之间的用户
res = models.Users.objects.filter(age__range=[18,50])
# 4.查询用户名中包含字母o的用户
res = models.Users.objects.filter(name__contains='o')  # 区分大小写
res = models.Users.objects.filter(name__icontains='o')  # 不区分大小写
# 5.查询月份是5月份的数据
res = models.Users.objects.filter(op_time__month=5)
# 6.查询年份是22年的数据
res = models.Users.objects.filter(op_time__year=2022)

外键字段的创建

	我们在讲数据库外键字段的时候,先讲了表与表之间的关系种类,一共有三种,分别是一对一、一对多、多对多的关系,然后我们
就可以根据这些关系来建立外键字段,一对多的关系我们就把外键字段建立在多得一方,多对多的关系我们就把外键建立在第三张关系表上,
一对一的关系外键可以建立在任意一张表上,推荐建立在使用频率较高的表上。
    我们在models.py文件建立四张表,分别是图书表、出版社表、作者表和作者详情表,我们就以这四张表为例子来创建表关系。
    1.书与出版社是一对多关系,书是多,出版社是一,Django ORM外键字段针对一对多关系也是建在多的一方,关键字是'ForeignKey'
    	示例:publish = models.ForeignKey(to='Publish')  # 默认关联的就是主键字段
	2.作者与作者详情是一对一关系,,Django ORM针对一对一关系建议外键字段建立在查询频率较高的表中,关键字是'OneToOneField'
    	示例:author_detail = models.OneToOneField(to='AuthorDetail')
	3.书与作者是多对多的关系,Django ORM针对多对多关系,可以不要建立第三张关系表,关键字是'ManyToManyField'
    	示例:authors = models.ManyToManyField(to='Author')  # 自动创建书和作者的第三张关系表
# 关键字
	1.ManyToManyField:不会在表中创建实际的字段,而是告诉Django ORM自动创建第三张表
	2.ForeignKey、OneToOneField:会在字段的后面添加_id后缀,如果你再定义模型类的时候自己添加了该后缀,那么在执行迁移命
令的时候还会再次追加_id,所以建议不要自己加
# 关键字的参数
	to:用于指定跟哪张表有关系,自动关联主键
	to_field:指定关联字段
    to_fields:指定关联多个字段

外键字段操作

# 一对一、一对多外键字段操作
	1.添加数据
    	方式一:
		models.Book.objects.create(title='cc',price=55555,publish_id=1)
        方式二:
        obj = models.Publish.objects.filter(pk=1).first()
    	models.Book.objects.create(title='zzz',price=5554.23,publish=obj)
	2.修改数据
    	方式一:
            models.Book.objects.filter(pk=1).update(title='qqq')
		方式二:
            obj = models.Publish.objects.filter(pk=2).first()
    models.Book.objects.filter(pk=1).update(publish_id=obj)
# 多对多字段操作
	1.第三张关系表创建数据
    	obj = models.Book.objects.filter(pk=2).first()
    obj.authors.add(1 )  # 括号内支持传入多个参数,用逗号隔开即可,也可以放数据对象
    2.第三张关系表修改数据
    	obj = models.Book.objects.filter(pk=2).first()
    obj.authors.set([2,])  # 括号内的参数必须是一个可迭代对象,里面的元素同样支持数据对象
    3.第三张关系表删除数据
    	obj = models.Book.objects.filter(pk=2).first()
    obj.authors.remove(2)  # 括号内的参数支持数据对象,同样支持多个
    4.第三张关系表清空指定数据
        obj = models.Book.objects.filter(pk=1).first()
        obj.authors.clear()  # 括号内无需传值,直接清空当前表在第三张关系表中的绑定记录

多表查询

	我们在讲述数据库的多表查询的时候,讲了两种方法,分别是子查询和连表查询,Django ORM本质上使用的还是上述两种方式,只
不过数据库的子查询是将SQL语句用括号括起来当做条件使用,Django ORM中是基于对象的跨表查询,数据库的连表查询是使用一些关键字把
所需要使用的表连成一张表然后操作,Django ORM连表操作是基于双下划线的跨表查询
# 正反向的概念
	核心在于当前数据对象是否含有外键字段,有的话就是正向,没有就是反向
    这个正反向查询是有一个口诀的,'正向查询按外键字段名,反向查询按表名小写'

基于对象的跨边查询

# 1.查询C++书籍对应的出版社
obj = models.Book.objects.filter(title='C++').first()
res = obj.publish
print(res)
# 2.查询C++对应的作者
obj = models.Book.objects.filter(title='C++').first()
res = obj.authors.all()
print(res)
# 3.查询作者oscar的详情信息
obj = models.Author.objects.filter(name='oscar').first()
res = obj.author_detail
print(res)
# 4.查询aachubanshe出版的书籍
obj = models.Publish.objects.filter(name='aachubanshe').first()
res = obj.book_set.all()
print(res)
# 5.查询oscar编写的书籍
obj = models.Author.objects.filter(name='oscar').first()
res = obj.book_set.all()
print(res)
# 6.查询电话是111的作者
obj = models.AuthorDetail.objects.filter(phone=111).first()
res = obj.author
print(res)

基于双下划线的跨表查询

# 1.查询C++对应的出版社名称
res = models.Book.objects.filter(title='C++').values('publish__name')
# 2.查询C++对应的作者姓名
res = models.Book.objects.filter(title='C++').values('authors__name')
# 3.查询作者oscar的手机号和地址
res = models.Author.objects.filter(name='oscar').values('author_detail__phone','author_detail__addr')
# 4.查询aachubanshe出版的书籍名称和价格
res = models.Publish.objects.filter(name='aachubanshe').values('book__title','book__price')
# 5.查询oscar编写的书籍名称和日期
res = models.Author.objects.filter(name='oscar').values('book__title','book__publish_time')
# 6.查询电话是111的作者的姓名
res = models.AuthorDetail.objects.filter(phone=111).values('author__name')

双下划线查询扩展

	基于双下划线的跨表查询的结果也可以是完整的数据对象,我们不点手中有条件的表,直接点最终的目标数据对应的表
# 1.查询C++对应的出版社名称
res = models.Publish.objects.filter(book__title='C++')
# 2.查询C++对应的作者姓名
res = models.Author.objects.filter(book__title='C++').values('name')
# 3.查询作者oscar的手机号和地址
res = models.AuthorDetail.objects.filter(author__name='oscar').values('phone','addr')
# 4.查询aachubanshe出版的书籍名称和价格
res = models.Book.objects.filter(publish__name='aachubanshe').values('title','price')
# 5.查询oscar编写的书籍名称和日期
res = models.Book.objects.filter(authors__name='oscar').values('title','publish_time')
# 6.查询地址是sh的作者的姓名
res = models.Author.objects.filter(author_detail__addr='sh').values('name')
# 7.连续跨表操作,查询C++对应的作者地址
res = models.Book.objects.filter(title='C++').values('authors__author_detail__addr')

如何查看SQL语句

# 方式一
	如果结果集对象是queryset,那么可以直接点query查看
# 方式二
	配置文件固定配置
    LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}
	把上述代码放到settings文件夹,然后只要执行了ORM操作就会打印内部SQL语句

这里是IT小白陆禄绯,欢迎各位大佬的指点!!!

posted @ 2022-05-17 21:48  陆禄绯  阅读(41)  评论(0编辑  收藏  举报