前言
如何只单独测试django中的某一个py文件呢?或者说如何书写测试脚本?
我们可以在任意一个py文件(应用下的tests或者自己新建一个)中书写以下代码:
前期准备
创建一个电影表
class Movie(models.Model): title = models.CharField(max_length=64) price = models.DecimalField(max_digits=8,decimal_places=2) publish_time = models.DateField() # 年月日 """ DateField() 里面可以设置两个参数 auto_now:每次修改数据的时候,都会自动将最新的更新时间记录下来 auto_now_add: 只在创建数据的时候将创建时间自动记录下来,之后不会再改变 """ # publish_time = models.DateTimeField() # 年月日 时分秒
1.create()
2.all()
3.filter()
4.update()
5.delete()
6.first()
7.last()
8.get()
9.value()
10.values_list()
11.order_by()
12.count()
13.exclude()
14.exists()
15.reverse()
16.distinct()
# 1.create() 返回值是当前被创建数据的对象本身 # 日期可以手动给 models.Movie.objects.create(title='红楼梦',price=876.23,publish_time='2014-1-1') # 还可以直接传日期对象 from datetime import date ctime = date.today() models.Movie.objects.create(title='西游记',price=666.12,publish_time=ctime) # 2.all() queryset对象 res = models.Movie.objects.all() print(res) # 3.filter() queryset对象 <QuerySet [<Movie: Movie object>]> # res = models.Movie.objects.filter(id=1) # pk指代的就是当前表的主键字段名,自动查找非常方便 res = models.Movie.objects.filter(pk=1) #res = models.Movie.objects.filter(pk=1,title='python入门') #括号内可以放多个条件,默认是and关系 print(res) #只要是queryset对象,就可以通过.query的方式查看到获取当前对象的内部sql语句 print(res.query) # 4.get() 直接获取对象本身(不推荐使用) 当查询条件不存在的时候会直接报错 res = models.Movie.objects.get(pk=1) print(res) print(res.title) # 5.values() queryset对象,[{},{},{}] 获取指定字段对应的数据 res = models.Movie.objects.values('title','publish_time') print(res) # 6.values_list() queryset对象,[(),(),()] 获取指定字段对应的数据 res = models.Movie.objects.values_list('title','price') print(res) #7.first() 取第一个元素对象 数据对象 #Movie res = models.Movie.objects.filter().first() #filter()可省略 print(res) # #8.last() 取最后一个元素对象 数据对象 #Movie res = models.Movie.objects.last() print(res) #9.update() 更新数据 返回的是受影响的行数 res = models.Movie.objects.filter(pk=1).update(title='红楼梦',price=555) print(res) #10.delete() 删除数据 返回值 受影响的表及行数 res = models.Movie.objects.filter(pk=3).delete() print(res) #11. count() 统计数据条数 res = models.Movie.objects.filter(pk=1).count() print(res) #12.order_by 按照指定字段排序 # res =models.Movie.objects.order_by('price') # 默认是升序 res = models.Movie.objects.order_by('-price') # 减号就是降序 print(res) #13.exclude 拿到指定字段之外的数据 res = models.Movie.objects.exclude(pk=1) print(res) #14.exists() (了解) 判断指定对象是否有数据 返回布尔值 res = models.Movie.objects.filter(pk=1000).exists() print(res) #15.reverse() 反转 返回QuerySet对象 res = models.Movie.objects.order_by('price').reverse() print(res) #16.distinct() 去重:去重的前提 必须是由完全一样的数据才可以 返回QuerySet对象 res = models.Movie.objects.values('title','price').distinct() print(res)
神奇的下划线查询
# 1.查询价格大于200的电影 res = models.Movie.objects.filter(price__gt=200) print(res) #QuerySet对象 # 2.查询价格小于500的电影 res = models.Movie.objects.filter(price__lt=600) print(res) # 3.查询价格大于等于400的电影 res = models.Movie.objects.filter(price__gte=400) print(res) #print(res.query) # 4.查询价格小于等于400的电影 res = models.Movie.objects.filter(price__lte=400) print(res) # 5.查询价格 是789 或555 或120 res = models.Movie.objects.filter(price__in=[789,555,120]) print(res) # 6.查询价格再200到700之间的电影 顾头也顾尾 res = models.Movie.objects.filter(price__range=(200,700)) print(res) # 7.查询电影名中包含字母p的电影 ''' 模糊查询: 关键字 like 关键符号 % _ ''' # res = models.Movie.objects.filter(title__contains='p') #默认区分大小写 res = models.Movie.objects.filter(title__icontains='p') #忽略大小写 print(res) # 8.查询2014年出版的电影 res =models.Movie.objects.filter(publish_time__year=2014) print(res) # 9.查询是1月份出版的电影 res = models.Movie.objects.filter(publish_time__month=1) print(res)
小结:
1.只要是queryset对象就可以无限制的调用queryset对象的方法
res = models.User.objects.filter(**kwargs).filter().filter().update()/delete()/values()
2.只要是queryset对象就可以直接点query查看当前queryset对象内部的sql语句
queryset_obj.query
查看所有orm语句内部的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', }, } }