• Django——数据库


    Django——数据库

    class Book(models.Model):
        book_name = models.CharField(max_length=20)
        price = models.DecimalField(max_digits=5 , decimal_places=2)
        inventory = models.IntegerField()
        # auto_now_add 设置为 True , 在创建数据的时候设置当前时间 ,后续对应的字段修改数据 ,该时间不会变化
        create_time = models.DateField(auto_now_add=True)
        # auto_now 设置为 True , 在创建数据的时候设置当前时间 ,
        # 后续对应的字段修改数据 ,该时间也会跟着跟新为修改后的时间
        update_time = models.DateField(auto_now=True)
        # DateField 设置了 auto_now_add 和 auto_now 属性之后 ,在新增数据的时候可以不手动添加
    
        class Meta:
            db_table = 'book'
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    Book.objects.create(book_name='白夜行' , price=98.95 , inventory=520)
    Book.objects.create(book_name='挪威的森林' , price=80.6 , inventory=510)
    Book.objects.create(book_name='解忧杂货店' , price=53.25 , inventory=623)
    Book.objects.create(book_name='三体' , price=120.5 , inventory=630)
    Book.objects.create(book_name='平凡的世界' , price=100.66 , inventory=100)
    Book.objects.create(book_name='人生的枷锁' , price=75.98 , inventory=50)
    Book.objects.create(book_name='追风筝的人' , price=46.33 , inventory=751)
    Book.objects.create(book_name='月亮与六便士' , price=75.98 , inventory=60)
    Book.objects.create(book_name='三国演义' , price=88.65 , inventory=751)
    Book.objects.create(book_name='摆渡人' , price=30.12 , inventory=630)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    # 查询数据
    # 使用 all 查询表格中的所有数据
    # values() 将数据以字典对象的方式显示
    # values_list() 将数据以元组对象的方式显示
    get_data = Book.objects.all().values_list()
    # print(get_data)
    
    get_data = Book.objects.filter(book_name='三体')
    # print(get_data.values_list())
    
    # get方法 , 获取单条数据 , 给定的条件也只能在数据表中是唯一的
    # 如果不唯一 , 则抛出异常
    get_data = Book.objects.get(id='6')
    print(get_data)
    print(get_data.book_name)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    # 排序: order_by , 默认情况是升序排序
    data = Book.objects.order_by('price')
    for d in data:
        print(d.book_name , d.price)
    
    print('*'*20)
    # 降序排序 , 在指定的属性名前面加上 '-'
    data = Book.objects.order_by('-price')
    for d in data:
        print(d.book_name, d.price)
    
    print('*' * 20)
    # reverse ,排序翻转,将升序变成降序 , 降序变为升序
    data = Book.objects.order_by('price').reverse()
    for d in data:
        print(d.book_name, d.price)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    # 大小比较
    # 大于 : gt
    data = Book.objects.filter(price__gt=80)
    # print(data)
    # 大于等于 :gte
    data = Book.objects.filter(price__gte=75.98)
    # print(data)
    # 小于 : lt
    data = Book.objects.filter(price__lt=75.98)
    print(data)
    # 小于等于 :lte
    data = Book.objects.filter(price__lte=75.98)
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # between 100 and 500
    # 取区间:range(100 , 500)
    data = Book.objects.filter(inventory__range=(100 , 520))
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    # like %:匹配0到多个字符  _:匹配一个字符(一个下划线匹配一个字符)
    # startswith 匹配以什么字符开头
    data = Book.objects.filter(book_name__startswith='追')   # like '追%'
    print(data)
    # endswith 匹配以什么字符结尾
    data = Book.objects.filter(book_name__endswith='人')  # like '%人'
    print(data)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    # 修改数据
    # 先获取到数据对象 , 再通过对象进行修改
    data = Book.objects.get(id=2)
    # 使用对象.属性名进行重新赋值的操作
    data.price= 75.23
    # data.save()
    
    # update() 方法修改 , 这个方法可以一次性修改多条数据
    data = Book.objects.filter(id=5)
    # data.update(inventory=300)
    
    data = Book.objects.filter(id__in=[3 , 8 , 9])
    data.update(inventory=300)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    # count 获取到查询的数据对象个数
    # 直接查询整个表中有多少条数据
    data = Book.objects.count()
    print(data)
    
    data = Book.objects.filter(price__gt=80).count()
    print(data)
    
    # 对查询得到的数据对象查询集进行切片
    data = Book.objects.all()
    print(data)
    print(data[0:4])
    
    data = Book.objects.filter(id__range=(0 , 4))
    print(data)
    print(data[2])
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    # 且或非
    # 且  &
    data = Book.objects.filter(price__gt=75 , inventory__gte=300)
    # print(data)
    # &  这个方式需要查询两个对象进行连接
    data = Book.objects.filter(price__gt=75) & Book.objects.filter(inventory__gte=300)
    # print(data)
    
    # 或 |
    data = Book.objects.filter(price__lt=75) | Book.objects.filter(inventory__gte=300)
    print(data)
    
    # Q 对象 是进行且或非的运算操作
    from django.db.models import Q
    # Q(条件)
    data = Book.objects.filter(Q(price__gt=75) & Q(inventory__gte=300))
    # print(data)
    data = Book.objects.filter(Q(price__lt=75) | Q(inventory__gte=300))
    # print(data)
    
    # 非 ~
    data = Book.objects.filter(~Q(price__lt=75))
    print(data)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    # F 表达式 ,直接在数据库中完成修改操作 , 不会将数据对象从数据库中读取到 Python 的内存中
    from django.db.models import F
    data = Book.objects.get(id=10)
    data.inventory = F('inventory') + 520
    data.save()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    # 聚合函数
    # 要使用聚合函数查询的时候需要和 aggregate 方法使用
    from django.db.models import Max , Min , Sum , Avg
    # 集合函数查询返回的结果是一个字典
    # 字典的键是默认为: 字段名__聚合函数名
    data = Book.objects.aggregate(Max('price'))
    print(data)
    data = Book.objects.filter(id__in=[1 , 5 , 7]).aggregate(Avg('price'))
    print(data)
    
    # 自定义集合函数查询结果的键名
    data = Book.objects.filter(id__in=[1, 5, 7]).aggregate(price = Avg('price'))
    print(data)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    # 删除数据 delete 方法
    # 先获取到要删除的数据对象 , 然后再使用 delete 方法
    data = Book.objects.get(id=4).delete()
    print(data)
    
    data = Book.objects.all().delete()
    print(data)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
  • 相关阅读:
    排序-基数排序
    LCP 18.早餐组合
    GeoServer+Postgis发布存储在Postgis中的栅格数据
    【前端甜点】某视频网站的m4s视频/音频下载方案(20240420)
    2023/9/18 -- C++/QT
    多元回归分析 | RF随机森林多输入单输出预测(Matlab完整程序)
    [传智杯 #5 初赛] I-不散的宴会
    详细指南:如何使用基于Double-Array Trie树的PHP扩展实现垃圾邮件过滤器
    javafx-自动下载文章并将doc转换为docx
    Java-1116
  • 原文地址:https://blog.csdn.net/xiugtt6141121/article/details/136666144