Django模型基础——(二)
上篇博客主要讲了django中对数据库的增删改查,下面深入再讲解下对数据库的操作。
常用的查询方法
下面以表名为User为例
- User.object.first() :返回表中第一条数据
- User.object.last():返回表中的最后一条数据
- User.object.get():指定条件,返回满足条件的唯一一条数据
first、last、get方法得到的都是一条数据,返回的是一个模型对象。
- User.object.filter():指定条件,过滤掉不满足条件的。
- User.object.exclude():指定条件,过滤掉满足条件的,与filter方法正好相反。
- User.object.all():返回表中所有数据,可加入参数,指定返回的字段。
- User.object.order_by():加入字段名为参数,可加入多个字段名,默认是正向排序,在字段名前加上负号表示逆向排序。
- User.object.reverse():对排序结果进行反转
- User.object.distint():对结果去重,常配合value方法使用。
- User.object.all().values():将all返回的QuerySet的moodel转为字典。
下面是all方法和value方法得到的,下面看看其和转成字典的对比。
以上这些方法返回的是QuerySet对象。
- User.object.exists():判断查询的数据是否存在
返回的是bool类型
- User.object.count():返回当前查询到的数据总数
返回的int类型
QuerySet对象支持索引和切片,映射于sql的limit。
常用查询条件
查询条件常用于filter方法。语法规则为:User.object.filter(字段名__条件关键词 = 条件值),下面对这个条件关键词加以总结。
- exact,相当于等于,iexact也是等于,不同的是他是忽略大小写的。
- gt,相当于大于号。
- gte,相当于大于等于号。
- lt,相当于小于号。
- lte,相当于小于等于号。
- contains,包含关系,指的是字段值是否包含指定的字符或数字。icontains也是忽略大小写的。
- startwith,判断是否以指定值开头。istartswith忽略大小写。
- endwith,判断是否以指定值结尾。iendswith忽略大小写。
- in,成员所属关系。
- range,判断是否在指定的范围中,范围是左闭右闭的。
- isnull,判断是否为空,值为True或False。
常用字段类型
- IntegerField,映射于数据库的整型int。
- CharField,单行字符串字段类型,必填参数是max_length,映射于数据库的varchar。
- TextField,多行文本字段,映射于数据库的longtext。
- FloatField、DecimalField,二者都是存放小数的类型,映射于数据库的float、decimal。
- DateField、DateTimeField,一个是日期类型,另一个是日期时间类型,映射于数据库的date和datetime。
- BooleanField,bool类型,映射于数据库的tinyint。
- AutoField,是一个自增长的int类型。
- OneToOneField,一对一关系的关联。
- ForeignKey,一对多的关系关联。
- ManyToManyField,多对多的关系关联。
以下是相对不是很常用的字段类型
- EmailField,电子邮件
- URLField,用于存放url地址
- BinaryField,存放原始二进制的字段,映射于数据库的binary。
- FileField,上传文件的字段。
- ImageField,是FileField的子类,用于图片存放的字段。
Field的常用参数
- primary_key:指定是否为主键。
- unique:指定是否唯一。
- null:指定是否为空,默认是False。
- unique_for_date:指定日期唯一。
- blank:等于True时,表单form验证可以为空,默认是False。
- DateField.auto_now:每次修改都将更新时间进去,但只有Model.save()方法才能调用这个,QuerySet.update()方法不会调用。
- DateField.auto_now_add:第一次创建这个字段时将此时时间添加进去,以后不会修改这个值。
下面实现一个表关系的例子,有四张表,分别是一对一的学生表和学生详细表,一对多的学生表和学院表,多对多的学生表和课程表。
下图是对四张表的创建模板类
创建完模板类保存上传后再执行python manage.py makemigrations和python manage.py migrate两条命令来将模板类写进数据库中。
下面分别看看五张表的结构,为什么是五张表呢?不是四张吗?
我们知道的是,两张表的多对多关系需要一张第三张表来关联,而django会为我们自动创建这么一张表。
下面这张表就是django为我们自动创建的第三张表。他将student_id和course_id分别于学生表和课程表相关联。