orm之单表操作
表记录(增-删-改-查)
1,增
-
方式一:实例化对象就是一条表记录
-
save方法:翻译成SQL语句,然后调用pymysql,发送给服务端
-
Frank_obj = models.Student(name ="david",course="python",birth="2000-9-9",fenshu=80) Frank_obj.save()
-
-
方式二:obj.create()创建
-
models.Student.objects.create(name ="路明非",course="python",birth="1995-5-9",fenshu=88)
-
2,删
-
delete()
-
models.UserInfo.objects.filter(id=7).delete() #queryset对象调用 models.UserInfo.objects.filter(id=7)[0].delete() #model对象调用
-
也可以一次性删除多个对象,每个Queryset都有一个delete()方法,他一次性删除所有Queryset对象
-
要牢记这一点:无论在什么情况下,QuerySet 中的 delete() 方法都只使用一条 SQL 语句一次性删除所有对象,而并不是分别删除每个对象。如果你想使用在 model 中自定义的 delete() 方法,就要自行调用每个对象的delete 方法。(例如,遍历 QuerySet,在每个对象上调用 delete()方法),而不是使用 QuerySet 中的 delete()方法。
-
-
删除所有对象
- …all().delete()
-
在 Django 删除对象时,会模仿 SQL 约束 ON DELETE CASCADE 的行为,换句话说,删除一个对象时也会删除与它相关联的外键对象
3,改
-
方式一:update
-
models.UserInfo.objects.filter(id=2).update( name='芬格尔', checked = 0, )
-
-
方式二:save
-
ret = models.UserInfo.objects.filter(id=2)[0] ret.name = '芬格尔+2' ret.checked = 1 ret.save()
-
4,查
-
all():结果为Queryset类型
-
filter 条件查询
-
查询条件不能匹配到数据时,不会报错,返回一个空的queryset,<QuerySet []>
-
如果没有写查询条件会获取所有数据,queryset类型的数据还能够继续调用fitler方法
-
ret = models.Book.objects.filter(条件1,条件2...)
-
-
get():只找一个
-
ret = models.Book.objects.get() #得到的是一个model对象,有且只能有一个
-
查不到数据会报错 :Book matching query does not exist.
-
超过一个就报错 :returned more than one Book -- it returned 13!
-
-
exclude():排除
-
obj对象排除
-
models.Book.objects.exclude(title__startswith=‘。。。’)
-
-
寻找一类数据--Queryset
-
models.Book.objects.all().exclude(title__startswith='。。。')
-
-
-
order_by():排序
-
‘+’ 或者 ‘-’号表示两种方向,一种升序,一种降序,‘+’默认不写
-
models.Book.objects.all().order_by('-price','id') #orderby price desc,id asc;
-
-
reverse() :反转
-
数据排序之后才能反转
-
models.Book.objects.all().order_by('id').reverse()
-
-
count() :计数
-
统计返回结果的数量
-
models.Book.objects.all().count()
-
-
first():返回第一条数据,结果是model对象类型
-
ret = models.Book.objects.all().first()
-
-
last(): 返回最后一条数据,结果是model对象类型
-
ret = models.Book.objects.all().last()
-
-
exists(): 判断返回结果集是不是有数据
-
models.Book.objects.filter(id=9999).exists() #有结果就是True,没有结果就是False
-
-
values():返回的queryset,里面是字典类型数据
-
ret = models.Book.objects.filter(id=9).values('title','price') <QuerySet [{'title': '龙族8', 'price': Decimal('67.00')}]>
-
ret = models.Book.objects.filter(id=9).values() <QuerySet [{'id': 9, 'title': '龙族8', 'price': Decimal('67.00'), 'publishDate': datetime.date(2019, 9, 9), 'publishHouse': '江南出版社'}]>
-
-
value_list():返回的queryset,里面是数组类型数据
-
ret = models.Book.objects.all().values_list('title','price') <QuerySet [('龙族0', Decimal('59.00')), ('龙族1', Decimal('60.00')), ('龙族2', Decimal('61.00')), ('龙族3', Decimal('62.00')), ('龙族4', Decimal('63.00')), ('龙族5', Decimal('64.00')), ('龙族6', Decimal('65.00')), ('龙族7', Decimal('66.00')), ('龙族8', Decimal('67.00')), ('龙族9', Decimal('68.00')), ('龙族10', Decimal('69.00')), ('龙族11', Decimal('70.00')), ('龙族12', Decimal('71.00')), ('龙族13', Decimal('72.00')), ('龙族14', Decimal('73.00')), ('龙族15', Decimal('74.00')), ('龙族16', Decimal('75.00')), ('龙族17', Decimal('76.00')), ('龙族18', Decimal('77.00')), ('龙族19', Decimal('78.00')), '...(remaining elements truncated)...']>
-
ret2 = Book.objects.filter(id=9).values_list('title', 'price') <QuerySet [('龙族8', Decimal('67.00'))]>
-
-
distinct() :去重
-
配和values和values_list来使用
-
models.Book.objects.all().values('publish').distinct()
-
5,双下方法查询
-
Book.objects.filter(price__in=[100,200,300]) #price值等于这三个里面的任意一个的对象 Book.objects.filter(price__gt=100) 大于等于 Book.objects.filter(price__lt=100) 小于等于 Book.objects.filter(price__range=[100,200]) #sql的between and,大于等于100,小于等于200 Book.objects.filter(title__contains="python") #title值中包含python的 Book.objects.filter(title__icontains="python") #不区分大小写 Book.objects.filter(title__startswith="py") #以什么开头,istartswith 不区分大小写 Book.objects.filter(pub_date__year=2012)
-
某年某月某日: ret = models.Book.objects.filter(publish_date__year='2018') ret = models.Book.objects.filter(publish_date__year__gt='2018')#2018写数字也可以 ret = models.Book.objects.filter(publish_date__year='2019',publish_date__month='8',publish_date__day='1')
-
找字段数据为空的双下滑线 models.Book.objects.filter(publish_date__isnull=True) #这个字段值为空的那些数据
在Django项目中测试orm的增删改查:test.py
'''
import os
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "DjangoORM.settings")
import django
django.setup()
# 注意!注意!注意!重要的事情说三遍,这里每段话位置都不能变。
# 在django.setup()这里就可以写Django的代码了
'''