ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Day55

2022-05-18 00:32:20  阅读:134  来源: 互联网

标签:obj models res filter book objects Day55


今日总结

  • 双下划线查询
  • orm创建外键关系
  • 外键字段的增删改查
  • 正反向的概念
  • 多表查询
  • 聚合与分组查询
  • F查询与Q查询

双下线查询

# __gt 大于	__lt 小于
	eg:查询年龄大于20的用户
        res = models.User.objects.filter(age__gt=20)
        
#  __gte 大于等于	__lte 小于等于
	eg:查询年龄大于等于20的用户
        res = models.User.objects.filter(age__gte=20)
        
# __in 成员运算
	eg:查询年龄在18到26之间的用户
        res = models.User.objects.filter(age__range=[18, 26])
        
# __range 范围查询
	eg:查询姓名中包含字母a的用户
        # contains 区分大小写	icontains 不区分大小
        res = models.User.objects.filter(name__contains='a')
        res = models.User.objects.filter(name__icontains='a')
        
# __year 按照年份筛选数据	__month 按照月份筛选数据
	eg:查询月份是5月的数据
        res = models.User.objects.filter(op_time__month=5)
        查询年份是22年的数据
        res = models.User.objects.filter(op_time__year=2022)
# 其他方法
	__startswith	# 以...开头
    __endswith	# 以...结尾
    __regex	 # 正则表达式

外键字段

django orm创建表
	图书表
    出版社表
    作者表
    作者详情表
# 关系判断
	书与出版社
        一本书不能对应多个出版社
        一个出版社可以对应多本书
    # 一对多关系 外键字段建在多的一方 '''
    
    书与作者
        一本书可以对应多个作者
        一个作者可以对应多本书
    # 多对多关系	ManyToManyField	可以不用自己创建第三张表
    作者与作者详情
        一个作者不能对应多个作者详情
        一个作者详情不能对个多个作者
    # 一对一关系	OneToOneField	外键字段建在查询频率较高的表中
 
'''
	ManyToManyField不会在表中创建实际的字段 而是告诉django orm自动创建第三张关系表
	ForeignKey、OneToOneField会在字段的后面自动添加_id后缀 如果你在定义模型类的时候自己添加了该后缀那么迁移的时候还会再次添加_id_id 所以不要自己加_id后缀
'''

外键字段操作

# 一对多、一对一外键字段操作
	# 增
  	方式1:	# 直接填写关联数据的主键值
    	models.Book.objects.create(title='聊斋志异', price=16987.22, publish_id=1) 
    方式2:
        publish_obj = models.Publish.objects.filter(pk=2).first()
    	models.Book.objects.create(title='资本论', price=56777.98, publish=publish_obj)
        
    # 删
    	models.Publish.objects.filter(pk=3).delete()
        
    # 改
  	方式1:
        models.Book.objects.filter(pk=1).update(publish_id=3)
    方式2:
        publish_obj = models.Publish.objects.filter(pk=2).first()
        models.Book.objects.filter(pk=1).update(publish=publish_obj)
    
 # 多对多字段操作
	# 添加关系
    方式1:
        book_obj = models.Book.objects.filter(pk=1).first()
        book_obj.authors.add(1)  # 在第三张关系表中添加数据
    方式2:
        book_obj = models.Book.objects.filter(pk=1).first()
        book_obj.authors.set([3, ])
        book_obj.authors.set([1, 2])
	
    # 修改关系
    方式1:
        book_obj = models.Book.objects.filter(pk=1).first()
        book_obj.authors.set([3, ])
        book_obj.authors.set([1, 2])
    方式2:
        book_obj = models.Book.objects.filter(pk=1).first()
        author_obj1 = models.Author.objects.filter(pk=3).first()
        author_obj2 = models.Author.objects.filter(pk=4).first()
        book_obj.authors.set([author_obj1, ])
        book_obj.authors.set([author_obj1, author_obj2])
        
    # 移除关系
    方式1:
        book_obj = models.Book.objects.filter(pk=1).first()
        book_obj.authors.remove(3)
        book_obj.authors.remove(3,4)
    方式2:
        book_obj = models.Book.objects.filter(pk=1).first()
        author_obj1 = models.Author.objects.filter(pk=1).first()
        author_obj2 = models.Author.objects.filter(pk=2).first()
        book_obj.authors.remove(author_obj1)
        book_obj.authors.remove(author_obj1,author_obj2)
        
    # 清空关系
    	book_obj = models.Book.objects.filter(pk=1).first()
    	book_obj.authors.clear()

正反向的概念

"""
MySQL多表查询思路
	子查询
		将SQL语句用括号括起来当做条件使用
	连表操作
		inner join\left join\right join\union
django orm本质还是使用的上述两种方法
	子查询>>>:基于对象的跨表查询
	连表操作>>>:基于双下划线的跨表查询
"""
	正向
  	eg:
        由书籍查询出版社 外键字段在书籍表中 那么书查出版社就是'正向'
        由书籍查询作者 外键字段在书籍表中 那么书查作者就是'正向'
        由作者查询作者详情 外键字段在作者表中 那么也是'正向'
        
    反向
  	eg:
      	由出版社查询书籍 外键字段不在出版社表 那么出版社查书就是'反向'
        
    '''
    	查询口诀
 		正向查询按外键字段名
 		反向查询按表名小写
    '''

基于对象跨表查询

# 基于对象的跨表查询本质就是子查询即分步操作
    1.查询数据分析书籍对应的出版社
    # 先获取书籍对象
    book_obj = models.Book.objects.filter(title='数据分析').first()
    # 再使用跨表查询
    res = book_obj.publish
    print(res)  # 出版社对象:北方出版社
    
    2.查询python全栈开发对应的作者
    # 先获取书籍对象
    book_obj = models.Book.objects.filter(title='python全栈开发').first()
    # 再使用跨表查询
    res = book_obj.authors  # app01.Author.None
    res = book_obj.authors.all()
    print(res)  # <QuerySet [<Author: 作者对象:jason>, <Author: 作者对象:jerry>]>
    
    3.查询作者jason的详情信息
    # 先获取jason作者对象
    author_obj = models.Author.objects.filter(name='jason').first()
    # 再使用跨表查询
    res = author_obj.author_detail
    print(res)  # 作者详情对象:芜湖

    4.查询东方出版社出版的书籍
    publish_obj = models.Publish.objects.filter(name='东方出版社').first()
    res = publish_obj.book_set  # app01.Book.None
    res = publish_obj.book_set.all()
    print(res)  # <QuerySet [<Book: 书籍对象:linux云计算>, <Book: 书籍对象:聊斋志异>]>
    
    5.查询jason编写的书籍
    author_obj = models.Author.objects.filter(name='jason').first()
    res = author_obj.book_set  # app01.Book.None
    res = author_obj.book_set.all()
    print(res)  # <QuerySet [<Book: 书籍对象:golang高并发>, <Book: 书籍对象:python全栈开发>]>
    
    6.查询电话是110的作者
    author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first()
    res = author_detail_obj.author
    print(res)  # 作者对象:jason

基于双下划线的跨表查询

# 基于双下划线的跨表查询本质就是连表操作

    1.查询数据分析书籍对应的出版社名称
    res = models.Book.objects.filter(title='数据分析').values('publish__name', 'publish__addr')
    print(res)  # <QuerySet [{'publish__name': '北方出版社', 'publish__addr': '北京'}]>
    
    2.查询python全栈开发对应的作者姓名和年龄
    res = models.Book.objects.filter(title='python全栈开发').values('authors__name','authors__age')
    print(res)  # <QuerySet [{'authors__name': 'jason', 'authors__age': 18}, {'authors__name': 'jerry', 'authors__age': 29}]>
    
    3.查询作者jason的手机号和地址
    res = models.Author.objects.fi
    lter(name='jason').values('author_detail__phone','author_detail__addr')
    print(res)  # <QuerySet [{'author_detail__phone': 110, 'author_detail__addr': '芜湖'}]>

    4.查询东方出版社出版的书籍名称和价格
    res = models.Publish.objects.filter(name='东方出版社').values('book__title','book__price')
    print(res)  # <QuerySet [{'book__title': 'linux云计算', 'book__price': Decimal('24888.44')}, {'book__title': '聊斋志异', 'book__price': Decimal('16987.22')}]>

    5.查询jason编写的书籍名称和日期
    res = models.Author.objects.filter(name='jason').values('book__title', 'book__publish_time')
    print(res)  # <QuerySet [{'book__title': 'golang高并发', 'book__publish_time': datetime.date(2022, 6, 7)}, {'book__title': 'python全栈开发', 'book__publish_time': datetime.date(2022, 2, 28)}]>
    
    6.查询电话是110的作者的姓名和年龄
    res = models.AuthorDetail.objects.filter(phone=110).values('author__name','author__age')
    print(res)  # <QuerySet [{'author__name': 'jason', 'author__age': 18}]>

有点难记QAQ

标签:obj,models,res,filter,book,objects,Day55
来源: https://www.cnblogs.com/ymxda9/p/16283045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有