Django框架的Model模型
Model是MVC设计思想中重要的一环,Model模型代表着数据层。
模型是你数据的唯一的,权威的信息源,它包含了你所存储数据的必要字段和行为。
- 每个模型都是一个 Python 的类,这些类继承
django.db.models.Model - 模型类的每个属性都相当于一个数据库的字段。
- 一般来说,每一个模型都映射一张数据库表。
- 利用这些,Django 提供了一个自动生成访问数据库的 API;
模型与数据库的关系
模型(Model)负责业务对象和数据库的关系映射(ORM)
ORM是 “对象-关系-映射”的简称。
模型的主要任务:
- 根据模型类生成表结构
- 将对模型对象的操作,转化为对应的sql语句,到数据库中去执行
- 将在数据库中的sql的结果,转化为对象,或者列表返回给使用者
优点:
Model是MVC设计思想中重要的一环,Model模型代表着数据层。主要负责程序中用于处理数据逻辑的部分。
通常情况下模型对象就是负责在数据库中的数据的存取的相关操作。
模型实现了数据模型与数据库的解耦,也就是说数据模型的设计不需要依赖特定的数据库。通过简单的配置就可以轻松的更换数据库
Model模型的配置
Django框架默认配置的数据库是sqllist3,可以根据需求更改数据库配置。
确认已经安装了mysql数据库
在mysql数据库中为项目创建一个数据库 mydb
create database mydb default charset=utf8mb4;
- 修改django框架中的数据库配置
web/web/settings.pyDATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'mydb', # 选择数据库 mydb'USER': 'root','PASSWORD': '','HOST': '127.0.0.1','PORT': '3306',}}
- 安装Django需要的数据库驱动 mysqlclient
pip install mysqlclient
- 接下来在创建模型之前,确定当前自己创建的应用已经在django中进行了配置
web/web/settings.pyINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','home']
Model模型的基本定义方式
创建模型类 应用的models.py文件中
- ```python from django.db import models
Create your models here.
定义学生 模型类 默认情况下,模型类的名字就是表的名字,通常是 应用名_模型类名
class Stu(models.Model):
# 定义属性。就成为这个表的字段name = models.CharField(max_length=20)age = models.IntegerField(default=18)sex = models.CharField(max_length=1,default='男')
2.生成迁移文件<br />运行manage.py文件,并给出指令,生成迁移文件```shell# python3 manage.py makemigrations(venv) MacBook-Pro:web yc$ python3 manage.py makemigrationsMigrations for 'home':home/migrations/0001_initial.py- Create model Stu
- 执行迁移
运行manage.py文件,并给出指令,执行迁移文件
在第一次执行项目的迁移时,django框架默认的应用中的迁移文件也会执行。# python3 manage.py migrate(venv) MacBook-Pro:web yc$ python3 manage.py migrateOperations to perform:Apply all migrations: admin, auth, contenttypes, home, sessionsRunning migrations:Applying contenttypes.0001_initial... OKApplying auth.0001_initial... OKApplying admin.0001_initial... OKApplying admin.0002_logentry_remove_auto_add... OKApplying admin.0003_logentry_add_action_flag_choices... OKApplying contenttypes.0002_remove_content_type_name... OKApplying auth.0002_alter_permission_name_max_length... OKApplying auth.0003_alter_user_email_max_length... OKApplying auth.0004_alter_user_username_opts... OKApplying auth.0005_alter_user_last_login_null... OKApplying auth.0006_require_contenttypes_0002... OKApplying auth.0007_alter_validators_add_error_messages... OKApplying auth.0008_alter_user_username_max_length... OKApplying auth.0009_alter_user_last_name_max_length... OKApplying auth.0010_alter_group_name_max_length... OKApplying auth.0011_update_proxy_permissions... OKApplying home.0001_initial... OKApplying sessions.0001_initial... OK
- 到数据库中查看这个执行后的结果 ```mysql mysql> use mydb;
mysql> show tables; +——————————————+ | Tables_in_mydb | +——————————————+ | auth_group | — auth 开头的表 是Django中默认的auth应用所产生的表 | auth_group_permissions | | auth_permission | | auth_user | | auth_user_groups | | auth_user_user_permissions | | django_admin_log | — django 开头的表 是django中默认的其他应用产生的表 | django_content_type | | django_migrations | — django中所有数据迁移的记录 | django_session | — django中session应用所使用的表 | home_stu | — home_stu 是我们自己定义的 模型类所对应和生成的表 +——————————————+
<a name="0db6b8fb"></a>### 在视图中调用模型进行数据操作<a name="814f0356"></a>#### 1.数据添加```python# 数据的添加# 方法一,属性赋值# obj = Stu()# obj.name = '张三'# obj.age = 20# obj.sex = '男'# obj.save()# 方法二,关键字参数传递# data = {'name':'lisi','age':22,'sex':'女'}# obj = Stu(**data)# obj.save()
2.数据查询
# 1 all. 查询所有数据# data = Stu.objects.all() # 结果集对象# 2 filter过滤器,带有条件的查询# data = Stu.objects.filter(sex='女')# <QuerySet [<Stu: Stu object (1)>, <Stu: Stu object (2)>, <Stu: Stu object (3)>]># print(data)# for i in data:# print(i)# print(i.name)# 3 通过id获取数据. 注意,get方法只能返回一个数据对象,多了少了都报错# obj = Stu.objects.get(id=3)# print(obj)
3.数据修改
obj = Stu.objects.get(id=3)obj.name = '王五'obj.save()
4.数据删除
obj = Stu.objects.get(id=2)obj.delete()
Model模型的字段
常用字段类型
字段类型被定义在
django.db.models.fields,但出于方便的目的,它们被引入django.db.models;
AutoField自动递增字段,通常给主键设置- 如果不定义主键字段则回自动创建id为主键,并自增
- 也可以自定义主键字段,则按照自定义主键进行创建
BooleanField可以存储true/false的字段CharField字符串字段,必须要设置max_length属性DateField日期字段。以下连个属性是相互排斥的,只能设置一个- auto_now 如果为True则自动更新这个字段为当前时间 作为最后一次修改时间,
- auto_now_add 如果为True则在创建这个对象时,为这个字段设置为当前时间,作为创建时间
DateTimeField日期时间字段,和DateField一样DecimalField使用pythonDecimal表示的十进制数,必须设置数字最大长度和小数位数EmailField邮箱字段,回经过django框架的检查是否为有效的邮箱格式字符串FileField上传文件字段。- upload_to 此属性提供了一种设置上传目录和文件名的方法,并且可以通过两种方式进行设置。
ImageField上传图片类型文件,会验证上传的文件类型是否是合法图片类型。其它和FileField一样IntegerField整数类型 等同于mysql中的int类型。TextField大文本字段,等同于mysql中的text类型
Model模型字段选项
- null 设置为True,则字段为必填,等同于 not null
- choices 可选项
- verbose_name 字段说明
- db_column 字段名称,如果没有设置,则把属性名作为字段名称
- db_index 索引
- default 默认值
- primary_key 主键
- unique 唯一索引
Model模型的修改
可以在任时候创建新的模型,然后生成迁移文件,并执行迁移
可以在任何时候删除模型或模型中的字段,然后生成迁移文件,并执行迁移
需要注意被删除的模型不能在视图函数或其它地方被使用。
当给模型添加一个新的字段时,在生成迁移文件时可能会出现下面的信息 ``` (venv) MacBook-Pro:web yc$ python3 manage.py makemigrations You are trying to add a non-nullable field ‘email’ to users without a default; we can’t do that (the database needs something to populate existing rows). Please select a fix: 1) Provide a one-off default now (will be set on all existing rows with a null value for this column) 2) Quit, and let me add a default in models.py Select an option:
这个信息是告诉你,你正在给一个模型添加一个不可为空的字段,现在需要你作出选择
1 就是给当前已经存在的行设置这个新的字段为null或其它的默认值 2 退出后修改当前的模型,设置字段可以为null,或者设置一个默认值
<a name="8fa08039"></a>##### 扩展作业MVT中的模型,视图,模版都已经给大家进行了讲解和简单的练习。接下来给大家安排一个独立的练习题作业。**任务一:使用Django框架完成一个模块的开发**任务分解:- 就是完成一个相同模型的 数据的增 删 改 查- 就类似之前学习mysql时的那个扩展作业- 最终实现一个django-web版本的用户管理模块- 模型设计,到模版页面到业务逻辑和路由全部自己独立完成。**任务二:去思考一个问题,思考一个电商中的订单表的结构**如果合理的创建订单表去存储订单相关字段。应该用什么字段,字段名,类型,等等。。。思考中别忘了一个问题:一个订单中可以购买2个a产品也可以在一个订单中购买2a产品和1个b产品作业提交:作业一,把视图函数代码和模型类,写到一个word或者markdown中,以名字命名作业二, 把订单的表结构写出来,顺便自己添加一些数据,形成文档。9990977加大群,找小姐姐加微信交流群,发布到群里。<a name="6fc1f9cc"></a>#### mac系统在mysqlclient安装时出现的错误**【问题分析】**从上面的内容可以看出安装过程中加载不了目标库文件 lssl ,而这个是openssl的软件包中的内容、我把上面日志中关键的几行摘下来
ld: library not found for -lssl clang: error: linker command failed with exit code 1 (use -v to see invocation) error: command ‘gcc’ failed with exit status 1
我只要告诉gcc库文件和连接文件都在哪里就行了、由于我是用homebrew进行包管理的、info一下就会有答案了
分别执行以下两个命令
brew config openssl
brew info openssl
查看 第二个命令中出现的 以下信息
For compilers to find openssl you may need to set: export LDFLAGS=”-L/usr/local/homebrew/opt/openssl/lib” export CPPFLAGS=”-I/usr/local/homebrew/opt/openssl/include”
【**解决问题**】在命令行终端中执行后面两句 export,根据你的命令结果执行你自己的哦。
export LDFLAGS=”-L/usr/local/homebrew/opt/openssl/lib”export CPPFLAGS=”-I/usr/local/homebrew/opt/openssl/include”
重新安装mysqlclient
pip install mysqlclient ```
