ORM执行原生SQL语句、双下划线数据查询、ORM外键字段的创建、外键字段的相关操作、ORM跨表查询、基于对象的跨表查询、基于双下划线的跨表查询、进阶查询操作
阅读原文时间:2023年07月09日阅读:1

今日内容

有时候ROM的操作效率可能偏低 我们是可以自己编写sql的
方式1:
    models.User.objects.raw('select * from app01_user;')
方式2:
    from django.db import connection
    cursor = connection.cursor()
    cursor.execute('select name from app01_user;')
    print(cursor.fetchall())


只要是queryset对象就可以无限制的点queryset对象的方法 

queryset.filter().values().filter().values_list().filter()...

大于 小于

__gt        大于
__lt        小于

大于等于 小于等于

__gte        大于等于
__lte        小于等于

或1 或2 或3

__in(1,2,3)

在1-10范围内

__range(1,10)

是否含有'j'

__contains='j'  #区分大小写
__icontains='j' #不区分大小写

查询注册年份

register_time_year = 2022
'''针对django框架时区问题 是需要配置文件中修改的 后续bbs讲解'''


mysql外键关系
    一对多
        外键字段建在多的一方
    多对多
        外键字段统一建在第三张表
    一对一
        任何一方都可以 但是建议建在查询频率高的表中

1.创建四张表

书籍表、出版社表、作者表、作者详情

2.确定外键关系

一对多 ORM与MYSQL一致 外键字段建在多的一方

多对多 ORM比MYSQL有变化
    1.外键字段可以直接建在某张表中(查询频率较高的)
        内部会自动帮你创建第三张关系表
    2.自己创建第三张关系表 并创建外键字段
        详情后续讲解

一对一 OPM与MYSQL一致 外键字段建在查询较高的一方

3.ORM外键字段的创建

针对一对多和一对一同步到表中会自动加_id的后缀

publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
     注意:django1.x版本默认外键字段都是级联更新级联删除的 django2.x及以上版本需要自己声明

针对多对多 不会再表中有展示 而是创建第三张表
authors = models.ManyToMangField(to='Author')

针对一对多添加关系

#插入数据可以直接写表中的实际字段
models.Book.objects.create(name='火浒传',price=6.66,publish_id=1)

#插入数据可以直接表中的类中字段名
publish_obj = models.Publish.objects.filter(pk=1).first()
#先获取到对象
models.Book.objects.create(name='四国演义',price=3.33,publish=publish_obj)
#将获取到的对象插入

'''一对一与一对多 一致'''
即可以传数字也可以传对象

针对多对多添加关系

book_obj = models.Book.objects.filter(pk=12).first()
#获取书籍对象
book_obj.authors.add(3)
book_obj.authors.add(3,2)
#在第三张表中给数据对象绑定作者 支持一个或多个 (作者主键)

book_obj =
    models.Book.objects.filter(pk=1).first()

author_obj=
    models.Author.objects.filter(pk=2).first()

author_obj2=
    models.Author.objects.filter(pk=1).first()

book_obj.author.addd(author_obj2)
#(作者对象)

修改关系

book_obj =
    models.Book.objects.filter(pk=10).first()
book_obj.authors.set((2,1))
book_obj.authors.set([2,])
#直接传外键 元组要加号    

book_obj =
    models.Book.objects.filter(pk=10).first()
author_obj=
    models.Author.objects.filter(pk=1).first()
book_obj.authors.set((author_obj))
#直接传对象

删除关系

book_obj =
   models.Book.objects.filter(pk=12).first()
book_obj.authors.remove(2)
 #移除这本书和2的绑定关系 

book_obj =
   models.Book.objects.filter(pk=12).first()
author_obj=
    models.Author.objects.filter(pk=1).first()
book_obj.authors.remove((author_obj))
#直接传数据

book_obj.authors.clear()#把这本书的关系全部清掉


add()\remove()        多个位置参数(数字 对象)
set()                可迭代对象(元组 列表)数字 对象
clear()                清空当前数据对象的关系

mysql跨表查询

    子查询
        分布操作:
            将一条sql语句用括号括起来当作另外一条sql语句的条件
    联表操作
        先整合多张表之后基于单表查询即可
            inner join  内连接
            left  join    左连接
            right join    右连接

正反向查询

正向查询
    由外键字段所在的表数据查询关联的表数据
    有外键字段 去查别人

反向查询
    没有外键字段的表数据查询关联的表数据
    没有外键 去查别人

ps:正反向核心就看外键在不在当前的数据表中

ORM跨表查询口诀
    正向查询按外键字段
    反向查询按表名小写

正向查询

1.查询主键为7的书籍对应的出版社名称
    book_obj= models.Book.objects.filter(pk=7).first()
    print(book_obj.publish.name)
2.查询主键为10的书籍对应的作者
    book_obj = models.Book.objects.filter(pk=10).first()
    print(book_obj.authors.all().values('name'))
3.查询joyce的电话号码    author_obj=models.Author.objects.filter(name='joyce').first()
    print(author_obj.author_detail.phone)

反向查询

1.查询月月出版社出版的书籍名称
    publish_obj = models.Publish.objects.filter(name='月月出版社').first()
    print(publish_obj.book_set.all().values())
2.查询kevin写过的书
    author_obj = models.Author.objects.filter(name='kevin').first()
    print(author_obj.book_set.all().values('name'))
3.查询电话号码是33333333333的作者姓名
    Author_Detailed_obj = models.Author_Detailed.objects.filter(phone=33333333333).first()
    print(Author_Detailed_obj.author.name)


1.查询主键为7的书籍对应的出版社名称   book_obj=models.Book.objects.filter(pk=7).values('publish__name')
print(book_obj)

2.查询主键为10的书籍对应的作者   book_obj=models.Book.objects.filter(pk=10).values('authors__name')
print(book_obj)

3.查询joyce的电话号码
author_obj=
models.Author.objects.filter(name='joyce').values('author_detail__phone')
print(author_obj)

4.查询月月出版社出版的书籍名称   publish_obj=models.Publish.objects.filter(name='月月出版社').values('book__name')
print(publish_obj)
5.查询kevin写过的书
author_obj = models.Author.objects.filter(name='kevin').values('book__name')
print(author_obj)
6.查询电话号码是33333333333的作者姓名
Author_Detailed_obj = models.Author_Detailed.objects.filter(phone=33333333333).values('author__name')
print(Author_Detailed_obj)


s.Publish.objects.filter(book__pk=7).values('name')
    print(res)
    # 2.查询主键为10的书籍对应的作者
    res = models.Author.objects.filter(book__pk=10).values('name')
    print(res)
    # 3.查询joyce的电话号码
    res = models.Author_Detailed.objects.filter(author__name='joyce').values('phone')
    print(res)
    # 1.查询月月出版社出版的书籍名称
    res = models.Book.objects.filter(publish__name='月月出版社').values('name')
    print(res)
    # 2.查询kevin写过的书
    res = models.Book.objects.filter(authors__name='kevin').values('name')
    print(res)
    # 3.查询电话号码是33333333333的作者姓名
    res = models.Author.objects.filter(author_detail__phone=33333333333).values('name')
    print(res)