• Django的ORM相关操作


    一般操作

    官方文件:https://docs.djangoproject.com/en/1.11/ref/models/querysets/

    必会操作

    一、返回QuerySet对象

    1)all()        查询所有结果

    2)filter(**kwargs)   包含了所有筛选条件相匹配的对象

    3)values()      返回一个ValueQuerySet——一个特殊的QuerySet,运行后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列

    4)values_list()    它与values()非常相似,它返回的是一个元组序列,values返回的是一个字典序列

    5)exclude()        它包含了与所给筛选条件不匹配的对象

    6)order_by()      对查询结果排序

    7)reverse()        对查询结果反向排序,请注意reverse()通常只能在具有已定义顺序的QuerySet上调用(在model类的Meta中指定ordering或调用order_by()方法)。

    8)distinct()      从返回结果中剔除重复纪录(如果你查询跨越多个表,可能在计算QuerySet时得到重复的结果。此时可以使用distinct(),注意只有在PostgreSQL中支持按字段去重。

    二、返回具体对象的

    1)get()          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。

    2)first()         返回第一条记录

    3)last()         返回最后一条记录

    三、返回布尔值的

    1)exists()      如果QuerySet包含数据,就返回True,否则返回False

    四、返回具体数值的

    1)count()      返回数据库中匹配查询(QuerySet)的对象数量。

     单表查询的双下划线

    1. models.Book.objects.filter(id__gt=1)
    2. models.Book.objects.filter(id__in=[1,2,3])
    3. models.Book.objects.filter(id__range=[1,5])
    4. models.Book.objects.filter(title__contains="沙河")
    5. models.Book.objects.filter(title__icontains="沙河")
    6. models.Book.objects.filter(title__startswith="沙河")
    7. models.Book.objects.filter(title__endswith="沙河")
    8. models.Book.objects.filter(publish_date__year=2017)
    9. models.Book.objects.filter(publish_date__month=2)

    外键的跨表查询

    一、 正向查找

    1. 基于对象
    book_obj = models.Book.object.get(id=1)
    book_obj.publisher.name

    2. 基于双下划线的
    models.Book.object.filter(id=1).values("publisher__name")

    二、 反向查找(由出版社查书)

    1. 基于对象
    publisher_obj = models.Publisher.objects.get(id=1)
    默认反向查找的时候是表名加_set
    publisher_obj.book_set.all()
    如果在外键中设置了related_name="books"
    publisher_obj.books.all()

    2. 基于双下划线
    models.Publisher.objects.filter(id=1).values("book__title")
    如果配置了related_query_name="books"
    models.Publisher.objects.filter(id=1).values("books__title")

    分组和聚合

    一、聚合

    from django.db.models import Avg, Sum, Max, Min, Count
    models.Book.objects.all().aggregate(Avg("price"))

    二、 分组

    book_list = models.Book.objects.all().annotate(author_num=Count("author"))

    F和Q

    1. 当需要字段和字段作比较的时候用F查询
    2. 当查询条件是 或 的时候 用Q查询,因为默认的filter参数都是且的关系

    事务

    1. 保证数据的原子性操作!!!

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        import datetime
        from app01 import models
    
        try:
            from django.db import transaction
            with transaction.atomic():
                new_publisher = models.Publisher.objects.create(name="火星出版社")
                models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10)  # 指定一个不存在的出版社id
        except Exception as e:
            print(str(e))
    View Code

    执行原生的SQL语句

    # extra
    # 在QuerySet的基础上继续执行子语句
    # extra(self, select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
    
    # select和select_params是一组,where和params是一组,tables用来设置from哪个表
    # Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
    # Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
    # Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
    # Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
    
    举个例子:
    models.UserInfo.objects.extra(
                        select={'newid':'select count(1) from app01_usertype where id>%s'},
                        select_params=[1,],
                        where = ['age>%s'],
                        params=[18,],
                        order_by=['-age'],
                        tables=['app01_usertype']
                    )
                    """
                    select 
                        app01_userinfo.id,
                        (select count(1) from app01_usertype where id>1) as newid
                    from app01_userinfo,app01_usertype
                    where 
                        app01_userinfo.age > 18
                    order by 
                        app01_userinfo.age desc
                    """
    
    
    # 执行原生SQL
    # 更高灵活度的方式执行原生SQL语句
    # from django.db import connection, connections
    # cursor = connection.cursor()  # cursor = connections['default'].cursor()
    # cursor.execute("""SELECT * from auth_user where id = %s""", [1])
    # row = cursor.fetchone()
    View Code

    Django ORM执行原生SQL

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        import datetime
        from app01 import models
    
        try:
            from django.db import transaction
            with transaction.atomic():
                new_publisher = models.Publisher.objects.create(name="火星出版社")
                models.Book.objects.create(title="橘子物语", publish_date=datetime.date.today(), publisher_id=10)  # 指定一个不存在的出版社id
        except Exception as e:
            print(str(e))
    View Code

    Django终端打印SQL语句

    在Django项目的settings.py文件中,在最后复制粘贴如下代码:

    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }

    在Python脚本中调用Django环境

    import os
    
    if __name__ == '__main__':
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "BMS.settings")
        import django
        django.setup()
    
        from app01 import models
    
        books = models.Book.objects.all()
        print(books)
  • 相关阅读:
    std::async
    k最近邻算法(kNN)
    QNX下进程间通信
    ubuntu 18.04 安装破解pycharm professional 专业版
    安装scrapy出现Twisted依赖问题
    pytorchhub解决bug:.cache orchhubmaster.zip.....'另一个程序正在使用此文件,进程无法访问。'
    pytorchhub教程之安装pytorch或pytorchversion
    错误:java.lang.ClassNotFoundException:org.apache.commons.fileupload.FileItemFactory 解决方案
    Failed to start component [StandardEngine[Catalina].StandardHost[localhost].错误解决方案
    Javaweb之注解访问servlet和web.xml配置文件
  • 原文地址:https://www.cnblogs.com/Skeener/p/9879678.html
Copyright © 2020-2023  润新知