1、启动命令行工具
首先打开命令行工具在django项目的根目录下面,输入-- python manage.py sheel
以进入命令行,
2、引入所需要操作的app的models
from hello import models
这里以hello app举例,先引入对应的models
3、通过代码来创建
这里通过对hello app下的Account model举例来说明创建过程
1.通过对象的静态函数直接创建
models.Account.objects.create(
、username= ' ',
password = ' ',
email = ' ',
)
2.先实例化对象,再用非静态对象函数来保存
account = Account.models(
username = ' ',
password = ' ',
email = ' ',
)
account.save()
4、对外键的关联操作
在django根据models创建的数据库表中,ForeignKey外键定义的字段名除非用户已经定义成id,否则存储时都会自动在结尾加上id,例如:在Article表中定义的account = models.ForeignKey("Account", on_delete=models.CASCADE)
在mysql数据库中会自动存储成account_id 故在对 对象模型进行添加字段的时候,不要直接对字段名进行字符串的添加,要对字段名_id进行整数的添加,或者对字段名进行对象的赋值。下面举例
假设现在我在代码中已经有一个名为acc的Account对象,并且有一个名为art的Article对象
(没有定义外键字段account_id)
1.对外键的字段名进行对象赋值
article.account = acc
2.对外键的字段名_id进行整数的赋值
article.account_id = acc.id
5、多对多ManyToManyField的操作
假如在对象创建时直接指定对象的多对多关联外键的话,系统会报错
例如我们在shell命令行中输入以下的代码:
art = models.Article(title='比特币的疯狂',content='数字加密货币的前景',publish_date='2021-05-28',tags=[2,3])
系统会直接报错:
注意必须先用代码--art.save()
保存对象数据到数据库中,才能添加外键关联,因为在mysql数据库中存储的多对多关系是另外一个表来存储对应的关系,并又系统隐式的添加外键。所以如果在数据库中没有该条记录的话,不存在该条记录的主键,是无法添加其他的关联的。
正确的做法是:
1.先创建对象
art = models.Article(title='比特币的疯狂',content='数字加密货币的前景',publish_date='2021-05-28')
2.对创建成功的对象进行添加外键关联(本表中tags)
art.tags.set([2,3])
之后在数据库中自动生成的表hello_article_tags就可以看到我们指定的多对多关系了
注意art.set([tag1.id,tag2.id,])
是赋值,如果需要在原有的基础上添加tags,需要用art.add(tag.id)
函数。set函数的参数是id的列表,add函数的参数直接是id
通过shell命令行来查询数据
from hello import models
依然是先引包
1、查询全部
models.Account.objects.all()
,会返回一个QuerySet对象的列表
其中Account是具体的表名
2、特定条件查询
通过models.Account.objects.filter(),来筛选条件进行判断,下面举几个常用的filter的过滤规则
判断等于
直接按照通常的格式加参数即可
判断不等于
在django的filter函数中没有>和<的操作,如果判断整数的大于或者小于需要'字段名'+'__'+'gt'='比较的值'的格式来判断,(大于是gt,大于等于是gte,小于是lt,小于等于是lte)
例如:我们现在要判断筛选出id大于等于3的account账户信息
models.Account.objects.filter(id_gte=1)
模糊查询
语法: filter(字段名__contains='匹配规则')
例如:models.Account.objects.filter(username__contains='a')
作用是在Account表中查询到username中包含小写字母a的记录。注意是django默认是大小写敏感的,而在mysql中大小写不敏感,所以搜索出结果和mysql中用like模糊匹配返回的结果可能有所不同
models.Account.objects.filter(username__icontains='a')
在双下划线之后输入icontains即为大小写不敏感的查询,和mysql中的like对应
stratswith
startswith是匹配以指定的字符串开头的字段,例如:
models.Account.objects.filter(username__startswith='wa')
作用是查找到所有的username以wa开头的字段。注意也是默认大小写敏感的,如果是要大小写不敏感的匹配则指定username__istartswith='wa'
对应mysql中:
SELECT * FROM hello_account WHERE username like "wa% "
endswith
endswith与上面startswith作用正好相反,匹配到以指定字符串为结尾的字段。
IN--区间匹配
区间匹配与mysql类似,代码如下:
models.Account.objects.filter(id__in=[1,3,4])
与mysql中如下语句作用相同
SELECT * FROM hello_account where username like '%wa%'
(hello_Account是在MySQL中自动创建的对应Account model的表名)
range区间匹配
range区间匹配本质上使用的是sql中的BETWEEN语法,直接举例:models.Account.objects.filter(id__range=[3,8])
是匹配出id在3到8闭区间范围内的记录
3、匹配出特定的时间范围内的字段
首先要引入datetime包,定义一个开始时间(t1)和一个结束时间(t2)然后以 字段名__range=[t1,t2]
的格式来查询,例如如下代码:
mdoels.Account.objects.filter(register_date__range=[t1,t2])
如上图所示,在执行查询之后系统会提示一个警告,提示收到了一个不带任何时区的时间(t1和t2),这是由于我们在settings设置了USE_TZ = True 使用时区。可以暂时忽略此警告
4、在筛选中利用正则表达式
关键字为 字段名__regex
,使用例如:
models.Account.objects.filter(username__regex=r'^(w|a)')
注意在python程序中写正则表达式字符串时,前面一定要加r,来取消转义字符的作用。同样如果指定关键字iregex
的话,会大小写模糊的匹配
5、通过get函数来精确查询
上述的filter函数可以来匹配返回多条记录,当需要精确查找一条记录的时候可以使用get函数,语法和filter函数相同,需要注意的是get函数只能返回一条数据,当没有查询到符合条件的数据或者是匹配到多条数据的时候,都会报错,通常用作查找或检验是否存在唯一的符合参数指定条件的数据。另外get的查询速度比filter要快一些。
6、exclude函数
exclude函数和filter函数的逻辑正好相反,会排除符合条件的数据,把其他不符合条件的数据返回