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'
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)
# 查询数据 # 使用 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)
# 排序: 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)
# 大小比较 # 大于 : 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)
# between 100 and 500 # 取区间:range(100 , 500) data = Book.objects.filter(inventory__range=(100 , 520)) print(data)
# like %:匹配0到多个字符 _:匹配一个字符(一个下划线匹配一个字符) # startswith 匹配以什么字符开头 data = Book.objects.filter(book_name__startswith='追') # like '追%' print(data) # endswith 匹配以什么字符结尾 data = Book.objects.filter(book_name__endswith='人') # like '%人' print(data)
# 修改数据 # 先获取到数据对象 , 再通过对象进行修改 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)
# 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])
# 且或非 # 且 & 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)
# F 表达式 ,直接在数据库中完成修改操作 , 不会将数据对象从数据库中读取到 Python 的内存中 from django.db.models import F data = Book.objects.get(id=10) data.inventory = F('inventory') + 520 data.save()
# 聚合函数 # 要使用聚合函数查询的时候需要和 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)
# 删除数据 delete 方法 # 先获取到要删除的数据对象 , 然后再使用 delete 方法 data = Book.objects.get(id=4).delete() print(data) data = Book.objects.all().delete() print(data)