目录
2. 日期字段参数unique_for_date: 日期必须唯一
1.前言
首先Django框架就是由MTV所组成的
Django的MTV分别是值:
M 代表模型(Model):负责业务对象和数据库的关系映射(ORM)。
T 代表模板 (Template):负责如何把页面展示给用户(html)。
V 代表视图(View):负责业务逻辑,并在适当时候调用Model和Template。
通过上面的定义我们可以看出Django框架的模型层与数据库有关联的。
所以模型层重点是如何和数据库进行交互实现的?
2.模型层的定义
那么模型层和数据库有什么关系呢?
模型与数据库的关系
- 模型(Model)负责业务对象和数据库的关系映射(ORM)
- ORM是“对象-关系-映射”的简称,主要任务是:
- 根据对象的类型生成表结构
- 将对象、列表的操作,转换为sql语句
- 将sql查询到的结果转换为对象、列表
- 使用ORM,我们就可以不用像以前一样写sql语言了
在模型层里面关于数据库的一些代码就不会和sql语句一样了,而是有自己的语法结构。
为什么要用模型?
它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库。
要实现Django与数据库的连通,请参考用Navicat连接MySQL的安装及配置_native mysql_embelfe_segge的博客-CSDN博客
3.修改数据库引擎
那么在写好模型层数据后,必须得在settings里配置mysql引擎,要让模型层知道在和哪个数据库交互,才能生成对应的迁移文件和数据表。
将其修改为mysql的一些配置,NAME代表数据库的名字,USER表示数据库登录的用户名,PASSWARD表示数据登录的密码,都是你自己下载mysql的时候设置的。
4.模型层的创建的一些常见字段和参数
字段类型有:
AutoField | int类型且自增,必须填入参数 primary_key=True。当model中如果没有自增字段,则自动会创建一个名为id的字段,并设置为主键、自增。所以django中会自动生成一个id自增的字段。 |
IntegerField | 整数类型,其数值范围在 -2147483648 - 2147483647。 |
CharField | 字符类型,必须提供max_length参数, max_length表示字符长度。 |
DateField | 日期字段,日期格式 YYYY-MM-DD,相当于Python中的datetime.date()实例。格式为:年-月-日 常用参数:
|
DateTimeField | 日期时间字段,格式 YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ],相当于Python中的datetime.datetime()实例。格式为:年-月-日 时:分:秒:毫秒 常用参数如DateField一致 |
FloatField | 浮点数类型,小数越长越不精准 |
DecimalField | 使用 Decimal 实例表示固定精度的十进制数的字段。它有两个必须的参数:
|
TextField(Field) | 大段文本类型,一般3000字以上使用 |
参数类型有:
1.任意字段都可以设置的参数
null
用于表示某个字段可以为空。设置方式:null = True
unique
用于表示该字段值在此表中必须是唯一的,建立唯一索引,设置方式:unique = True
db_index
将该字段设置为索引,设置方式:db_index = True
default
为该字段的默认值,设置方式:default = ‘默认值’
db_column
在数据库中的字段名称,默认和变量同名,设置方式:db_column=‘字段名’
primary_key
设置字段为主键,设置方式:primary_key = True。通常id字段为主键,且唯一主键
2. 日期字段参数
unique_for_date: 日期必须唯一
unique_for_month: 月份必须唯一
unique_for_year: 年份必须唯一
auto_now_add: 增加记录时的时间
auto_now: 更新当前记录的时间
3. 用于Admin后台管理参数
verbose_name:Admin中显示的字段名称
blank:Admin中是否允许用户输入为空
editable :Admin中是否可以编辑
help_text:Admin中该字段的提示信息
choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作(设置方式:choice=((1,‘男’),(2,‘女’),(0,‘未知’)) )
5.模型层的基本语法和使用
必知必会13条
# 1.models.类名.objects.all() #查询所有数据
# 2.models.类名.objects.filter() #带有过滤条件的查询,返回的是一个列表
# 3.models.类名.objects.get() #拿到单个数据,但是条件不存在直接报错
# 4.models.类名.objects.first() #拿queryset里面的第一个数据
# res = models.User.objects.all().first()
# print(res)
# 5.models.类名.objects.last() #拿queryset里面的最后一个数据
# res = models.User.objects.all().last()
# print(res)
# 6.models.类名.objects.values() #可以指定获取的数据字段 select name,age from ... 列表套字典
# res = models.User.objects.values('name','age') # <QuerySet [{'name': 'jason', 'age': 18}, {'name': 'egonPPP', 'age': 84}]>
# 7.models.类名.objects.values_list() 列表套元祖
# res = models.User.objects.values_list('name','age') # <QuerySet [('jason', 18), ('egonPPP', 84)]>
# print(res)
# 8.models.类名.objects.distinct() 去重
# res = models.User.objects.values('name','age').distinct()
# print(res)
# 去重一定要是一模一样的数据,如果带有主键那么肯定不一样 你在往后的查询中一定不要忽略主键
# 9.models.类名.objects.order_by() 排序,默认升序
# res = models.User.objects.order_by('age') # 默认升序
# res = models.User.objects.order_by('-age') # 降序
# 10.models.类名.objects.reverse() 反转的前提是 数据已经排过序了 order_by()
# res = models.User.objects.all()
# res1 = models.User.objects.order_by('age').reverse()
# print(res,res1)
# 11.models.类名.objects.count() 统计当前数据的个数
# res = models.User.objects.count()
# print(res)
# 12.models.类名.objects.exclude() 排除在外
# res = models.User.objects.exclude(name='jason')
# print(res)
# 13.exists() 基本用不到因为数据本身就自带布尔值 返回的是布尔值
# res = models.User.objects.filter(pk=10).exists()
# print(res)