Django orm基本crud方法大全!!所有操作只看一篇文章就够了!!
话不多说 直接上方法
这里用到的数据结构为
class something(models.Model):
id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入
name = models.CharField(max_length=32) # 名称
price = models.DecimalField(max_digits=5, decimal_places=2) # 价格
date = models.DateField() # 时间
1.添加数据
1.1 一般方法
实例化对象来保存数据,但是需要使用save才会存入数据
from app01 import models
def add(request):
thing = models.something(name="镁铝",price="300",date="2020-9-24")
thing.save()
return HttpResponse("<p>数据添加成功!</p>")
1.2 ORM(推荐)
通过 ORM 提供的 objects 提供的方法 create 来实现
from app01 import models
def add(request):
thing = models.something.objects.create(title="衰哥",price="200",date="2020-9-24")
return HttpResponse("<p>数据添加成功!</p>")
2.查询数据
1.1 all() 查询所有数据
使用 all() 方法来查询所有内容。
返回的是 QuerySet 类型数据,类似于 list,里面放的是一个个模型类的对象,可用索引下标取出模型类的对象。
def all(request):
thing = models.something.objects.all()
print(thing,type(thing)) # QuerySet类型,类似于list,访问 url 时数据显示在命令行窗口中。
for i in thing:
print(i.name)
return HttpResponse("<p>查找成功!</p>")
2.2 filter() 方法用于查询符合条件的数据
返回的是 QuerySet 类型数据,类似于 list,里面放的是满足条件的模型类的对象,可用索引下标取出模型类的对象。
pk=3 的意思是主键 primary key=3,相当于 id=3。
因为 id 在 pycharm 里有特殊含义,是看内存地址的内置函数 id(),因此用 pk。
def filter(request):
thing = models.something.objects.filter(pk=3)
print(thing)
thing = models.something.objects.filter(price=200)
for i in thing:
print(i.name)
return HttpResponse("<p>查找成功!</p>")
2.3 exclude() 方法用于查询不符合条件的数据。
返回的是 QuerySet 类型数据,类似于 list,里面放的是不满足条件的模型类的对象,可用索引下标取出模型类的对象。
def exclude(request):
thing = models.something.objects.exclude(pk=3)
print(thing)
books = models.Book.objects.exclude(price=200)
for i in thing:
print(i.name)
return HttpResponse("<p>查找成功!</p>")
2.4 get()
方法用于查询符合条件的返回模型类的对象符合条件的对象只能为一个,如果符合筛选条件的对象大于一个,或没有一条符合都会报错
def get(request):
##假设有几条数据
##ID=5,PRICE=200
##ID=6,PRICE=200
thing = models.something.objects.get(pk=5)
thing = models.something.objects.get(pk=18) # 报错,没有符合条件的对象
thing = models.something.objects.get(price=200) # 报错,符合条件的对象超过一个
for i in thing:
print(i.name)
return HttpResponse("<p>查找成功!</p>")
2.5 order_by() 方法用于对查询结果进行排序。
返回的是 QuerySet类型数据,类似于list,里面放的是排序后的模型类的对象,可用索引下标取出模型类的对象。
注意:
a、参数的字段名要加引号。
b、降序为在字段前面加个负号 -。
def order_by(request):
thing = models.something.objects.order_by("price") # 查询所有,按照价格升序排列
thing = models.something.objects.order_by("-price") # 查询所有,按照价格降序排列
return HttpResponse("<p>查找成功!</p>")
2.6 reverse() 方法用于对查询结果进行反转。
返回的是 QuerySe t类型数据,类似于 list,里面放的是反转后的模型类的对象,可用索引下标取出模型类的对象。
def reverse(request):
# 按照价格升序排列:降序再反转
thing = models.something.objects.order_by("-price").reverse()
return HttpResponse("<p>查找成功!</p>")
2.7 count() 方法用于查询数据的数量返回的数据是整数。
def count(request):
thing = models.something.objects.count() # 查询所有数据的数量
#高级用法
thing = models.something.objects.filter(price=200).count() # 查询符合条件数据的数量
return HttpResponse("<p>查找成功!</p>")
2.8 first() 方法返回第一条数据返回的数据是模型类的对象。
def first(request):
some = models.something.objects.first() # 返回所有数据的第一条数据
return HttpResponse("<p>查找成功!</p>")
2.9 last() 方法返回最后一条数据返回的数据是模型类的对象。
def last(request):
some = models.something.objects.last() # 返回所有数据的最后一条数据
return HttpResponse("<p>查找成功!</p>")
2.10 exists() 方法用于判断查询的结果 QuerySet 列表里是否有数据。
返回的数据类型是布尔,有为 true,没有为 false。
注意:判断的数据类型只能为 QuerySet 类型数据,不能为整型和模型类的对象。
def exists(request):
thing = models.something.objects.exists()
# 报错,判断的数据类型只能为QuerySet类型数据,不能为整型
thing = models.something.objects.count().exists()
# 报错,判断的数据类型只能为QuerySet类型数据,不能为模型类对象
thing = models.something.objects.first().exists()
return HttpResponse("<p>查找成功!</p>")
2.11 values() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个可迭代的字典序列,字典里的键是字段,值是数据。
注意:
- 参数的字段名要加引号
- 想要字段名和数据用 values
def values(request):
# 查询所有的id字段和price字段的数据
thing = models.something.objects.values("pk","price")
print(thing[0]["price"],type(thing)) # 得到的是第一条记录的price字段的数据
return HttpResponse("<p>查找成功!</p>")
2.12 values_list() 方法用于查询部分字段的数据。
返回的是 QuerySet 类型数据,类似于 list,里面不是模型类的对象,而是一个个元组,元组里放的是查询字段对应的数据。
注意:
- 参数的字段名要加引号
- 只想要数据用 values_list
def values_list(request):
# 查询所有的price字段和publish字段的数据
thing = models.something.objects.values_list("price","publish")
print(thing)
print(thing[0][0],type(thing)) # 得到的是第一条记录的price字段的数据
return HttpResponse("<p>查找成功!</p>")
2.13 distinct() 方法用于对数据进行去重。
返回的是 QuerySet 类型数据。
注意:
- 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
- distinct() 一般是联合 values 或者 values_list 使用。
def distinct(request):
# 查询一共有几种价格
thing = models.something.objects.values_list("price").distinct()
# 对模型类的对象去重没有意义,因为每个对象都是一个不一样的存在。
thing = models.something.objects.distinct()
return HttpResponse("<p>查找成功!</p>")
2.14 filter() 方法基于双下划线的模糊查询(exclude 同理)。
注意:filter 中运算符号只能使用等于号 = ,不能使用大于号 > ,小于号 < ,等等其他符号,但是有专门的符号来代替,看下面的代码块!!!!!。
注意:为双下划线!!!!
__in 用于读取区间,= 号后面为区间 。
def filter(request):
# 查询价格为200或者300的数据
books = models.Book.objects.filter(price__in=[200,300])
#__gt 大于号 ,= 号后面为数字。
# 查询价格大于200的数据
books = models.Book.objects.filter(price__gt=200)
#__gte 大于等于,= 号后面为数字。
# 查询价格大于等于200的数据
books = models.Book.objects.filter(price__gte=200)
#__lt 小于,=号后面为数字。
# 查询价格小于300的数据
books=models.Book.objects.filter(price__lt=300)
#__lte 小于等于,= 号后面为数字。
# 查询价格小于等于300的数据
books=models.Book.objects.filter(price__lte=300)
#__range 在 ... 之间,左闭右闭区间,= 号后面为两个元素的区间。
books=models.Book.objects.filter(price__range=[200,300])
#__contains 包含,= 号后面为字符串。
books=models.Book.objects.filter(name__contains="喔喔")
#__icontains 不区分大小写的包含,= 号后面为字符串。
books=models.Book.objects.filter(name__icontains="python") # 不区分大小写
#__startswith 以指定字符开头,= 号后面为字符串。
books=models.Book.objects.filter(name__startswith="喔喔")
#__endswith 以指定字符结尾,= 号后面为字符串。
books=models.Book.objects.filter(name__endswith="喔喔")
#__year 是 DateField 数据类型的年份,= 号后面为数字。
books=models.Book.objects.filter(date__year=2008)
#__month 是DateField 数据类型的月份,= 号后面为数字。
books=models.Book.objects.filter(date__month=10)
#__day 是DateField 数据类型的天数,= 号后面为数字。
books=models.Book.objects.filter(date__day=01)
return HttpResponse("<p>查找成功!</p>"
3.删除
3.1 delete() 使用模型类删除
thing=models.something.objects.filter(pk=8).first().delete()
delete() 使用 QuerySet 删除 (推荐)
thing=models.something.objects.filter(pk__in=[1,2]).delete()
4.修改
4.1 通过拿到模型重新赋值再次执行save方法
thing = models.something.objects.filter(pk=7).first()
thing.price = 400
thing.save()
4.2 update 使用QuerySet修改(推荐)
thing = models.something.objects.filter(pk__in=[7,8]).update(price=888)
return HttpResponse(thing)
本作品采用《CC 协议》,转载必须注明作者和本文链接