Django框架之模型层

一、前期准备

1、测试脚本

当你只是想要测试Django中的某一个py文件内容,那么你可以不用书写前后端交互的形式,而是直接写一个测试脚本即可

这内容其实就是最外部 manage.py 文件中的上面几句话

脚本代码无论是写在应用下的 tests.py文件还是自己新建文件,将内容写在新文件中,都会生效

from django.test import TestCase

# Create your tests here.
import os

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django05.settings')
    import django
    django.setup()
    
	# 在下面书写我们需要测试的代码
    # 即所有的测试代码都必须等待环境准备完毕之后才能书写

2、数据准备

在models.py里面创建我们需要的数据库中的表

class User(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    register_time = models.DateField()  # 年月日
    """
    DateField
    DateTimeField
        两个重要参数
        auto_now: 每次操作数据的时候,该字段会自动将当前时间更新
        auto_now_add: 在创建数据的时候会自动将当前创建时间记录下来,之后只要不人为的修改,那么就一直不变
    """

    def __str__(self):
        return f'对象:{
     
     self.name}'

3、配置文件

DATABASES = {
   
   
    'default': {
   
   
        'ENGINE': 'django.db.backends.mysql',
        # 数据库名字
        'NAME': 'day64',
        # 用户
        "USER": "root",
        # 密码
        "PASSWORD": "111111",
        # IP
        "HOST": "127.0.0.1",
        # 端口
        "PORT": 3306,
        # 编码集
        "CHARSET": "utf8",
    }
}
  • 在项目下的 init.py 中声明数据库类型
import pymysql

pymysql.install_as_MySQLdb()

二、单表操作

1、数据的增加

from django.test import TestCase

# Create your tests here.
import os

if __name__ == '__main__':
    os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django05.settings')
    import django
    django.setup()
    
	from app01 import models

    models.User.objects.all()

    # register_time (1)支持自己指定传值
    res = models.User.objects.create(name='zhang', age=67, register_time='2000-1-1')
    # 返回值为对象本身
    print(res)  # User object
    
    # register_time (2)支持传入日期对象
    import datetime
    # 生成一个当前的时间对象
    ctime = datetime.datetime.now()
    user_obj = models.User(name='quan', age=54, register_time=ctime)
    user_obj.save()

2、数据的删除

pk会自动查找到当前表的主键字段,指代的就是当前表的主键字段
用了pk之后,就不需要指代当前表的主键字段到底叫什么了

  • uid
  • pid
  • sid

(1)查询后直接删除

res = models.User.objects.filter(pk=2).delete()

(2)先查询再删除

user_obj = models.User.objects.filter(pk=1).first()
user_obj.delete()

3、数据的修改

(1)查询后直接修改

res = models.User.objects.filter(pk=5).update(name="quan")

(2)先查询再修改

  • get方法返回的直接就是当前数据对象,但是方法不推荐使用
  • 因为一旦数据不存在该方法会直接报错,而filter则不会,所以我们一般都是用filter
# 不推荐使用 : 如果查询的数据不存在会直接报错 ,fileter不会
user_obj = models.User.objects.get(pk=6)
user_obj = models.User.objects.filter(pk=6)
# 调用对象更改数据
user_obj.name = "xiao"
user_obj.save()

4、数据的查询

(1)查询全部:all

user_obj = models.User.objects.all()

(2)按指定条件过滤:filter和get

  • 方式一:filter
user_obj = models.User.objects.filter(age=18)
# 筛选后得到的对象是一个 QuerySet 对象,里面会有所有符合添加的数据对象
print(user_obj) # <QuerySet [<User: User object (1)>, <User: User object (2)>]>

# 方法补充
# (1)获取到当前 QuerySet 对象的第一个对象
print(user_obj.first())
# User object (1)
print(user_obj.last())
# User object (2)
  • 方式二:get
user_obj = models.User.objects.get(pk=1)
# 获取到的是一个数据对象,只能获取到唯一条件的数据对象
print(user_obj) # User object (1)

# 如果有多个符合条件的数据会报错
# app01.models.User.MultipleObjectsReturned: get() returned more than one User -- it returned 2!
# 如果有不符合条件的数据会报错
# app01.models.User.DoesNotExist: User matching query does not exist.

5、获取到指定字段的数据

(1)获取到一个字段的数据:values

  • 返回的数据格式为列表套字典 - 本质上是一个 QuerySet 对象 ,而不是真的列表
user_obj = models.User.objects.values("name")
print(user_obj)
# <QuerySet [{'name': 'dream'}, {'name': 'chimeng'}]>

(2)获取到多个字段的数据:values_list

  • 返回的数据格式为列表套元祖 - 本质上是一个 QuerySet 对象 ,而不是真的列表
user_obj = models.User.objects.values_list("name","age")
print(user_obj) 
# <QuerySet [('dream', 18), ('chimeng', 18)]>

6、查看内部SQL语句的方式

(1)方式1

  • queryset对象.query==>查看orm内部的sql语句
res = models.User.objects.values_list('name', 'age')
print(res.query)  # 查看内部SQL语句

(2)方式2:所有的sql语句都能查看

  • 去配置文件中配置一下即可
LOGGING = {
   
   
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
   
   
        'console':{
   
   
            'level':'DEBUG',
            'class':'logging.StreamHandler',
        },
    },
    'loggers': {
   
   
        'django.db.backends': {
   
   
            'handlers': ['console'],
            'propagate': True,
            'level':'DEBUG',
        },
    }
}

(3)小结

  • 查看sql语句的方式,只能用于queryset对象
  • 只有queryset对象才能够点击query查看内部的sql语句

7、去重

去重一定要是一模一样的数据,如果有主键,那么肯定不一样

所以一定要去除主键后再去重

res = models.User.objects.values('name', 'age').distinct()

8、排序

(1)默认升序

user_obj = models.User.objects.order_by('age')
print(user_obj)
# <QuerySet [<User: User object (1)>, <User: User object (2)>, <User: User object (3)>, <User: User object (4)>]>

(2)降序

user_obj = models.User.objects.order_by('-age')
print(user_obj)
# <QuerySet [<User: User object (4)>, <User: User object (3)>, <User: User object (1)>, <User: User object (2)>]>

(3)反转

  • 反转的前提是数据已经经过排序过的数据

  • 只能对有序的数据进行反转

user_obj = models.User.objects.order_by('age').reverse()
print(user_obj)
# <QuerySet [<User: User object (4)>, <User: User object (3)>, <User: User object (1)>, <User: User object (2)>]>

9、统计个数

user_obj = models.User.objects.count()
print(user_obj)
# 4

10、剔除结果

  • 排出在外
  • 将某个数据排出在结果之外
user_obj = models.User.objects.exclude(name="dream")
print(user_obj)
# res = models.User.objects.exclude(user="dream")

11、是否存在

  • 是否存在
  • 返回的是布尔值
  • 用处不大,因为数据本身就有布尔值的状态
user_obj = models.User.objects.filter(name="dream").exists()
print(user_obj)
# True

12、总结:必知必会十三条

# 以下方法的前提均为 models.模型表名.objects 之后的方法

1. all()      查询所有数据
2. filter()   带有过滤条件的查询
  我们在利用数据的主键字段筛选数据的时候,可以不考虑主键字段叫什么,直接用pk代替
3. get()      直接拿数据对象,但是条件不存在直接报错
4. first()    拿queryset里面第一个元素
5. last()     拿queryset里面最后一个元素

6. value()    可以指定获取的数据字段   select name,age from ...  返回的结果是列表套字典  <QuerySet [{
   
   'name': 'xiao', 'age': 18}, {
   
   'name': 'quandsb', 'age': 54}]>
7. values_list()    返回的结果像是列表套元组  <QuerySet [('xiao', 18), ('quandsb', 54)]>

8. distinct()
    res = models.User.objects.values('name', 'age').distinct()
    去重一定要是一模一样的数据,如果有主键,那么肯定不一样
9. reverse()  反转的前提是数据已经排过序了
10. order_by()  排序
    res = models.User.objects.order_by('age')  # 默认升序
    res = models.User.objects.order_by('-age')  # 降序
11. count()    统计当前数据的个数
12. exclude()    排除在外
13. exists()    

# 补充:查看当前ORM语句的SQL查询语句
# 注意可以使用此方法的必须是 QuerySet 对象
.query

三、神奇的双下划线查询

1、条件大于

  • 年龄大于35岁的数据
res = models.User.objects.filter(age__gt=35)
print(res)

2、条件小于

  • 年龄小于35岁的数据
res = models.User.objects.filter(age__lt=35)
print(res)

3、条件大于等于

年龄大于等于35岁的数据

res = models.User.objects.filter(age__gte=35)
print(res)

4、条件小于等于

  • 年龄小于等于35岁的数据
res = models.User.objects.filter(age__lte=35)
print(res)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值