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])

image-20210529233434158

如上图所示,在执行查询之后系统会提示一个警告,提示收到了一个不带任何时区的时间(t1和t2),这是由于我们在settings设置了USE_TZ = True 使用时区。可以暂时忽略此警告

image-20210529234054488

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函数的逻辑正好相反,会排除符合条件的数据,把其他不符合条件的数据返回