Django之数据库操作

Posted Captain

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django之数据库操作相关的知识,希望对你有一定的参考价值。

 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  生成相应的表

 注:创建数据时,注意指定编码:

CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

 在html页面中添加

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

 解决编码中文乱码问题。


 如果后台要用到该表,还需在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()

 

 

 

以上是关于Django之数据库操作的主要内容,如果未能解决你的问题,请参考以下文章

Django之ORM

Django之ORM

django基础之信号

Django之model操作

Django之Model操作

前端面试题之手写promise