首页 > 其他分享 >django 06 模型层 ORM查询

django 06 模型层 ORM查询

时间:2022-12-15 21:44:21浏览次数:53  
标签:06 name Author models res django filter ORM 查询

ORM执行SQL语句

 

神奇的双下划线查询

import os

def main():
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoorm.settings')
    import django
    django.setup()
    from app01 import models
"""双下划线查询实战"""
    # 1.查询年龄大于20的作者
    res = models.Author.objects.filter(age__gt=20)
    print(res)
    # 结果:
    # < QuerySet[ < Author: Author
    object(2) >, < Author: Author
    object(3) >, < Author: Author
    object(4) >, < Author: Author
    object(6) >] >
    # 2.查询年龄小于25岁的作者
    res = models.Author.objects.filter(age__lt=25)
    print(res)
    # 结果:
    # < QuerySet[ < Author: Author
    object(1) >, < Author: Author
    object(3) >, < Author: Author
    object(4) >] >
    """大于等于:__gte、小于等于:__lte"""
    # 3.查询年龄是18,28,38的作者
    res = models.Author.objects.filter(age__in=(18,28,38))
    print(res)
    # 结果:
    # < QuerySet[ < Author: Author
    object(1) >, < Author: Author
    object(2) >, < Author: Author
    object(6) >] >
    # 4.查询作者名字中带有字母j的数据
    res = models.Author.objects.filter(name__contains='j')   # 区分大小写
    print(res)
    # 结果:
    # < QuerySet[ < Author: Author
    object(6) >] >
    '''__icontains="j"是不区分大小写'''
    # 5.查询出版年份是2022年的书籍数据
    res = models.Book.objects.filter(publish_time__year=2022).values()
    print(res)
    # 结果:
    # < QuerySet[ < Book: Book
    object(1) >, < Book: Book
    object(4) >, < Book: Book
    object(5) >] >
main()
""" - 只要是queryset对象就可以无限制的点queryset对象的方法 queryset.filter().values().filter().values_list().filter()... 1. .values()取到的queryset对象是这样的格式 结果:<QuerySet [{'id': 1, 'title': '红楼梦', 'price': Decimal('99.88'), 'publish_time': datetime.date(2022, 12, 15), 'publish_id': 1}, {'id': 4, 'title': '西游记', 'price': Decimal('56.99'), 'publish_time': datetime.date(2022, 12, 20), 'publish_id': 2}, {'id': 5, 'title': '三国志', 'price': Decimal('998.00'), 'publish_time': datetime.date(2022, 12, 5), 'publish_id': 4}]>
2. .values_list()取到的queryset对象是这样的格式 结果:<QuerySet [(1, '红楼梦', Decimal('99.88'), datetime.date(2022, 12, 15), 1), (4, '西游记',Decimal('56.99'), datetime.date(2022, 12, 20), 2), (5, '三国志', Decimal('998.00'), datetime.date(2022, 12, 5), 4)]> - 对django框架如果不进行时区设置,则无法对时间进行筛选,配置再settings文件 """

ORM外键字段的创建

# ORM外键关系
    一对一,一对多,多对多

# 1.创建基础表(书籍表,出版社表,作者表,作者详细)

# 2.确定外键关系
         一对一 :ORM于MYSQL一致,外键字段建在查询较高的一方
         一对多 :ORM的外键字段和MYSQL相同,建在多的一方
         多对多 :ORM比MYSQL变化更多
               -1.外键字段可以直接建在某张查询频率较高的表中
                       内部会自动创建第三张表用于存放关系
               -2.自己创建第三张关系表并创建外键字段
# 3.ORM创建
     对于一对一,一对多在同步到表中之后会自动添加_id的后缀
     对于多对多,不会在表中做展示,而是创建第三张表

# 4.基础表创建,外键关系代码
class Book(models.Model):
    # 图书表
    title = models.CharField(max_length=32, verbose_name='书名')
    price = models.DecimalField(max_digits=8,decimal_places=2,verbose_name='价格')
    publish_time = models.DateField(auto_now_add=True,verbose_name='出版日期')

    publish = models.ForeignKey(to='Publish',on_delete=models.CASCADE)
    authors = models.ManyToManyField(to='Author')

class Publish(models.Model):
    # 出版社表
    name = models.CharField(max_length=32,verbose_name='出版社名')
    address = models.CharField(max_length=64,verbose_name='地址')


class Author(models.Model):
    # 作者表
    name = models.CharField(max_length=32,verbose_name='作者名')
    age = models.IntegerField(verbose_name='年龄')

    authorDetail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    # 作者详情表
    phone = models.BigIntegerField(verbose_name='电话号码')
    address = models.CharField(max_length=64,verbose_name='作者地址')

外键字段的相关操作

"""一对一与一对多一致"""
    # 1.针对一对多,插入数据可以直接填写表中实际的字段
    # models.Book.objects.create(title='本草纲目',price=123.33,publish_id=1)
    # 2.针对一对多,插入数据也可以填写表中的类中字段名(既可以传数字也可以传对象)
    # publish_obj = models.Publish.objects.filter(pk=1).first()
    # models.Book.objects.create(title='活着', price=555.66, publish=publish_obj)
"""多对多关系绑定"""

未补全



 

ORM跨表查询

# 1.MYSQL连表查询思路
"""
   1.子查询
         分布操作
   2.连表操作
         先整合多张表之后基于单表查询即可
           inner join   内连接
           left join      左连接
           right join    右连接
"""
# 2.正反向查询的概念
     1.正向查询
         由外键字段所在的表数据查询关联的表数据
     2.反向查询
         没有外键字段的表数据查询关联的表数据
     ps:判断正反向就看外键字段在不在数据所在表中

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

基于对象的跨表查询

# 查询步骤
    步骤一:先根据条件获取数据对象
    步骤二:再判断正反向的概念
"""因为要考虑表名小写后获取的数据是多个,所以+_set接收""" # 1.正向: # 1.查询主键为1的书籍对应的出版社名称 book_obj = models.Book.objects.filter(pk=1).first() print(book_obj.publish.name) # 2.查询主键为4的书籍对应的作者姓名 book_obj = models.Book.objects.filter(pk=4).first() print(book_obj.authors.all().values('name')) # 3.查询tom的电话号码 author_obj = models.Author.objects.filter(name='tom').first() print(author_obj.authorDetail.phone) # 2.反向 # 4.查询北京出版社出版过的书籍 publish_obj = models.Publish.objects.filter(name='北京出版社').first() print(publish_obj.book_set.all().values('title')) # 5.查询hanser写过的书 author_obj = models.Author.objects.filter(name='hanser').first() print(author_obj.book_set.all().values('title')) # 6.查询电话号码是119的作者姓名 authordetail_obj = models.AuthorDetail.objects.filter(phone='119').first() print(authordetail_obj.author.name)

基于双下划线的跨表查询

# 1.正向:
    # 1.查询主键为1的书籍对应的出版社名称
    res = models.Book.objects.filter(pk=1).values('publish__name','title')
    print(res)
    # 2.查询主键为4的书籍对应的作者姓名
    res = models.Book.objects.filter(pk=4).values('title','authors__name')
    print(res)
    # 3.查询tom的电话号码
    res = models.Author.objects.filter(name='tom').values('authorDetail__phone')
    print(res)

# 2.反向
    # 4.查询北京出版社出版过的书籍
    res = models.Publish.objects.filter(name='北京出版社').values('book__title', 'book__price', 'name')
    print(res)
    # 5.查询hanser写过的书
    res = models.Author.objects.filter(name='hanser').values('book__title', 'name')
    print(res)
    # 6.查询电话号码是119的作者姓名
    res = models.AuthorDetail.objects.filter(phone=119).values('phone', 'author__name')
    print(res)

依据结果表进行的进阶跨表查询

# 1.正向:
    # 1.查询主键为1的书籍对应的出版社名称
    res = models.Publish.objects.filter(book__pk=1).values('name')
    print(res)
    # 2.查询主键为4的书籍对应的作者姓名
    res = models.Author.objects.filter(book__pk=4).values('name','book__title')
    print(res)
    # 3.查询tom的电话号码
    res = models.AuthorDetail.objects.filter(author__name='tom').values('phone')
    print(res)

# 2.反向
    # 4.查询北京出版社出版过的书籍
    res = models.Book.objects.filter(publish__name='北京出版社').values('title','price')
    print(res)
    # 5.查询hanser写过的书
    res = models.Book.objects.filter(authors__name='hanser').values('title')
    print(res)
    # 6.查询电话号码是119的作者姓名
    res = models.Author.objects.filter(authorDetail__phone=110).values('name')
    print(res)

ORM查询总结

# 1.查询主键为4的书籍对应的作者的电话号码
    res = models.Book.objects.filter(pk=4).values('authors__authorDetail__phone')
    print(res)
res = models.AuthorDetail.objects.filter(author__book__pk=4).values('phone') print(res)
res = models.Author.objects.filter(book__pk=4).values('authorDetail__phone') print(res)

 

标签:06,name,Author,models,res,django,filter,ORM,查询
From: https://www.cnblogs.com/juzijunjun/p/16985666.html

相关文章

  • django框架(6)
    目录ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于上下划线的跨表查询进阶操作ORM执行SQL语句有时候ORM的操作......
  • Django框架6
    今日内容概要ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于双下划线的跨表查询进阶操作今日内容详细......
  • 进入python的世界_day53_Django模型层的外键建立、连表查询
    一、ORM执行SQL语句1.raw()models.表名.objects.raw('sql语句')#注意,sql语句内的表,要用应用+表名才是真正能查到的表2.运用模块​ 不会提示,要自己手敲,就是类似以......
  • ORM执行原生SQL语句、双下划线数据查询、ORM外键字段的创建、外键字段的相关操作、ORM
    今日内容ORM执行SQL语句有时候ROM的操作效率可能偏低我们是可以自己编写sql的方式1: models.User.objects.raw('select*fromapp01_user;')方式2: fromdjango.d......
  • django 6 模型层数据查询
    今日内容详细目录今日内容详细ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段数据的增删改查模型层之表结构搭建数据准备多表查询ORM跨表查询思路基于对象的......
  • python之路50 ORM执行SQL语句 操作多表查询 双下线方法
    ORM执行SQL语句有时候ORM的操作效率可能偏低我们是可以自己编写SQL的方式1:models.User.objects.raw('select*fromapp01_user;')方式2:fromdjango.dbim......
  • ORM创建外键字段与多表查询
    内容概要ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段数据的增删改查多表查询(基于对象的跨表查询、基于双下划线的跨表查询)内容详细ORM执行......
  • Django模型层
    测试环境Django默认需要整个项目跑起来才可以运行功能函数,如果想测试某个文件需要准备测试环境。(主要指模型层models.py)1.python自带测试环境pythonConsole但整个是......
  • django orm查询
    目录今日内容概要今日内容详细ORM执行SQL语句神奇的双下划线查询ORM外键字段的创建外键字段相关操作ORM跨表查询基于对象的跨表查询基于双下划线的跨表查询进阶操作今日内......
  • 解决ORM错误:django.db.utils.IntegrityError: (1452, 'Cannot add or update a child
    #修改settings.pyDATABASES={'default':{'ENGINE':'django.db.backends.mysql','NAME':'test','HOST':'127.0.0.1','POR......