1、创建model表,在setting中添加app名称、配置数据
from django.db import models class userinfo(models.Model): #如果没有models.AutoField,默认会创建一个id的自增列 name = models.CharField(max_length=30) email = models.EmailField() memo = models.TextField()
运行:python manage.py makemigrations python manage.py migrate 生成相应的表
如果后台要用到该表,还需在admin.py中注册,如下:
2、数据库增、删、改、查
查询篇
models.UserInfo.objects.all() models.UserInfo.objects.all().values(‘user‘) #只取user列 models.UserInfo.objects.all().values_list(‘id‘,‘user‘) #取出id和user列,并生成一个列表 models.UserInfo.objects.get(id=1) models.UserInfo.objects.get(user=‘yangmv‘)
增加篇
models.UserInfo.objects.create(user=‘yangmv‘,pwd=‘123456‘) 或者 obj = models.UserInfo(user=‘yangmv‘,pwd=‘123456‘) obj.save() 或者 dic = {‘user‘:‘yangmv‘,‘pwd‘:‘123456‘} models.UserInfo.objects.create(**dic)
删除篇
models.UserInfo.objects.filter(user=‘yangmv‘).delete()
修改篇
models.UserInfo.objects.filter(user=‘yangmv‘).update(pwd=‘520‘) 或者 obj = models.UserInfo.objects.get(user=‘yangmv‘) obj.pwd = ‘520‘ obj.save()
常用方法:
# 获取个数 # # models.Tb1.objects.filter(name=‘seven‘).count() # 大于,小于 # # models.Tb1.objects.filter(id__gt=1) # 获取id大于1的值 # models.Tb1.objects.filter(id__lt=10) # 获取id小于10的值 # models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值 # in # # models.Tb1.objects.filter(id__in=[11, 22, 33]) # 获取id等于11、22、33的数据 # models.Tb1.objects.exclude(id__in=[11, 22, 33]) # not in # contains # # models.Tb1.objects.filter(name__contains="ven") # models.Tb1.objects.filter(name__icontains="ven") # icontains大小写不敏感 # models.Tb1.objects.exclude(name__icontains="ven") # range # # models.Tb1.objects.filter(id__range=[1, 2]) # 范围bettwen and # 其他类似 # # startswith,istartswith, endswith, iendswith, # order by # # models.Tb1.objects.filter(name=‘seven‘).order_by(‘id‘) # asc # models.Tb1.objects.filter(name=‘seven‘).order_by(‘-id‘) # desc # limit 、offset # # models.Tb1.objects.all()[10:20] # group by from django.db.models import Count, Min, Max, Sum # models.Tb1.objects.filter(c1=1).values(‘id‘).annotate(c=Count(‘num‘)) # SELECT "app01_tb1"."id", COUNT("app01_tb1"."num") AS "c" FROM "app01_tb1" WHERE "app01_tb1"."c1" = 1 GROUP BY "app01_tb1"."id"
3、Django高级查询
filter查询:
1. 等于 exact。 例:查询name等于‘xiao ming’的学生 Student.objects.filter(name=‘xiao ming‘) Student.objects.filter(name__exact=‘xiao ming‘)#此处的exact可以省略 2. 模糊查询 like 包含 contains 例:查询姓名包含‘xiao‘的学生。 Student.objects.filter(name__contains=‘xiao‘) 开头:startswith 结尾:endswith 例:查询姓名以‘xiao‘开头的学生 以‘ming‘结尾的学生 Student.objects.filter(name__startswith=‘xiao‘) Student.objects.filter(name__endswith=‘ming‘) 3. 空查询 isnull 例:查询姓名不为空的学生 Student.objects.filter(name__isnull=False) 4. 范围查询 in 例:查询年龄12或15或16的学生 Student.objects.filter(age__in=[12,15,16]) 5. 比较查询 gt lt(less than) gte(equal) lte 例:查询年龄大于等于12的学生 Student.objects.filter(age__gte=12) 6. 日期查询 date 例:查询1994年出生的学生。 Student.objects.filter(birthyear__date=1994) 例:查询1994年1月1日后出生的学生。 Student.objects.filter(birthyear__date__gt = date(1994,1,1)) 7. 返回不满足条件的数据 exclude 例:查询id不为3的学生。 Student.objects.exclude(id=3)
同时传递多个字段参数限制,但是这样传递的字段参数限制为与运算
Student.objects.filter(name=‘xiao ming‘,age=12)
但是我们要查询姓名是‘xiao ming‘或者年龄等于12该如何使用?Q对象可以用来在字段限制间进行逻辑运算(&,|,~)
from django.db.models import Q #引入 Student.objects.filter(Q(name=‘xiao ming‘)|Q(age=12))
聚合函数:
QuerySet通过aggregate这个函数来实现聚合功能
使用前需先导入聚合类: from django.db.models import Sum,Count,Max,Min,Avg 例:查询所有学生的数目 select count(*) from student; Student.objects.aggregate(Count(‘id‘)) {‘id__count‘: 5} 注意返回值类型及键名 例:查询所有学生年龄和 Student.objects.aggregate(Sum(‘age’)) {‘age__sum’:120} 注意返回值类型及键名
字段排序:
QuerySet 通过order_by来对字段进行排序
对年龄从小到大进行排序 Student.objects.all().order_by(‘age‘) 对年龄从大到小进行排序 Student.objects.all().order_by(‘-age‘)
自定义查询语句:
通过Django的connection对象直接执行SQL语句
cursor = connection.cursor() sql=‘‘‘select name,age from student ‘‘‘ cursor.execute(sql) fetchall=cursor.fetchall() students=[] for object in fetchall: students.append({‘name‘:object[0],‘age‘:object[1]})
通过connection获取游标,然后通过游标执行SQL语句,通过fetchall函数返回查询结果,注意返回结果为一个集合,里面每个元素为一个数组,以select 后面字段顺序返回
我们可以使用同样方法对数据进行增加修改删除操作,不过与查询有点不同的是需要transaction进行提交修改
cursor = connection.cursor() sql=‘‘‘update student set age=13 where name=‘xiao ming‘ ‘‘‘ cursor.execute(sql) transaction.commit_unless_managed()