ORM

分组和聚合

分组 annotate

image.png

image.png

SQL联表查询:

select * from person left join dept on person.dept_id = dept.id;
// 分组(求部门平均工资,按部门分组)
select dept, Avg(salary) from person left join dept on person.dept_id = dept.id group by person.dept_id;

ORM联表分组查询:

models.Person.objects.values(""dept_id).annotate(avg=Avg("salary)).values("dept__name", "a")
# avg=Avg("salary") 给求出的值 赋值给avg字段

ORM中values或者values_list 里面写什么字段,就相当于select 什么字段
ORM中 annotate 前面是什么就按照什么分组

聚合 aggregate

extra

执行原生SQL语句

  1. extra (相当于查询里嵌套子查询)
    查询person表中工资是否大于1400
ret = models.Person.objects.all().extra(
    select={"gt": "salary > 2000"}
)
for i in ret:
    print(i.name, i.gt)
小王  1
小明  1
小虎  0
小绿  0
  1. 执行原生的SQL语句
from django.db. import connection
cursor = connection.cursor()  # 获取光标,等待执行sql语句
cursor.execute("""SELECT * from person where id = %s""", [1])
row = cursor.fetchone()
print(row)
1 小王 2000 1

在Django终端打印ORM操作对应的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',
        },
    }
}

QuerySet

filter后是一个QuerySet对象,如果要取到对应的user对象,要用first()取QuerySet对象的第一个

user = models.UserInfo.objects.filter(username=username).first()

查看ORM执行语句的原生SQL代码

  • 在settings中添加下面的代码:
LOGGING = {
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'console':{
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
        'django.db.backends': {
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}  
  • 显示单行查询的SQL语句
    查询结果为一个QuerySet对象,直接.query
    email = models.Book.objects.filter(title='python').values("publish__email")
    print(email.query)

你可能感兴趣的:(ORM)