Django之models模型层、测试环境的搭建

君自故乡来,应知故乡事 / 2023-08-02 / 原文

一、models层中常见的几种查询方法

1、.values()和.values_list()方法

默认查询所有的字段,也可以指定某一个字段

res = models.Userinfo.objects.values()  # 默认查询所有的字段
    # <QuerySet [{'id': 1, 'username': 'cc1', 'password': '123'}, {'id': 2, 'username': 'cc2', 'password': '123'}, {'id': 3, 'username': 'cc3', 'password': '123'}]>
    res = models.Userinfo.objects.values('username')
    # <QuerySet [{'username': 'cc1'}, {'username': 'cc2'}, {'username': 'cc3'}]>
    res = models.Userinfo.objects.values_list()
    # <QuerySet [(1, 'cc1', '123'), (2, 'cc2', '123'), (3, 'cc3', '123')]>
    print(res)

2、排序

 order by age asc/desc

res = models.User.objects.all().order_by('age')  # 默认是升序排列
res = models.User.objects.all().order_by('-age')  # 降序排列
res = models.User.objects.all().order_by('age', 'id')  # 降序排列
res = models.User.objects.all().order_by('age', '-id', '')  # 降序排列

3、去重,

每一条数据都要完全一样,如果说带主键,一定不会重复

res = models.User.objects.all().values('password', 'age').distinct()
print(res)

4、反转,先排序,数据要先有序才能反转

降序---> 升序

res=models.User.objects.all().order_by('-age').reverse()
print(res)

5、count

select count(*) from user
res = models.User.objects.count()
print(res)

6、exclude 排除

res=models.User.objects.exclude(username='kevin1')
print(res)

7、exist 是否存在

res = models.UserInfo.objects.filter(pk=1).exist()
print(res) 

二、测试环境的搭建

1、app应用中默认有一个tests.py的测试文件,拷贝manage.py的内容如下到tests.py中

此时这个测试文件就能使用django环境了

import os
import sys

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'djangoProject222.settings')
    import django

    django.setup()
  from app01 import models

三、查看原生sql语句

1、方法一

print(res.query)

res = models.Userinfo.objects.values()  # 默认查询所有的字段
print(res)
print(res.query)

## 输出
SELECT "app01_userinfo"."id", "app01_userinfo"."username", "app01_userinfo"."password" FROM "app01_userinfo"  

2、方法二

修改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',
        },
    }
}

四、基于双下滑线的查询