Django框架的Model模型

Model是MVC设计思想中重要的一环,Model模型代表着数据层。

模型是你数据的唯一的,权威的信息源,它包含了你所存储数据的必要字段和行为。

  • 每个模型都是一个 Python 的类,这些类继承 django.db.models.Model
  • 模型类的每个属性都相当于一个数据库的字段。
  • 一般来说,每一个模型都映射一张数据库表。
  • 利用这些,Django 提供了一个自动生成访问数据库的 API;

模型与数据库的关系

模型(Model)负责业务对象和数据库的关系映射(ORM)

ORM是 “对象-关系-映射”的简称。

模型的主要任务:

  1. 根据模型类生成表结构
  2. 将对模型对象的操作,转化为对应的sql语句,到数据库中去执行
  3. 将在数据库中的sql的结果,转化为对象,或者列表返回给使用者

优点:

Model是MVC设计思想中重要的一环,Model模型代表着数据层。主要负责程序中用于处理数据逻辑的部分。

通常情况下模型对象就是负责在数据库中的数据的存取的相关操作。

模型实现了数据模型与数据库的解耦,也就是说数据模型的设计不需要依赖特定的数据库。通过简单的配置就可以轻松的更换数据库

Model模型的配置

Django框架默认配置的数据库是sqllist3,可以根据需求更改数据库配置。

  1. 确认已经安装了mysql数据库

  2. 在mysql数据库中为项目创建一个数据库 mydb

    1. create database mydb default charset=utf8mb4;
  1. 修改django框架中的数据库配置
    web/web/settings.py
    1. DATABASES = {
    2. 'default': {
    3. 'ENGINE': 'django.db.backends.mysql',
    4. 'NAME': 'mydb', # 选择数据库 mydb
    5. 'USER': 'root',
    6. 'PASSWORD': '',
    7. 'HOST': '127.0.0.1',
    8. 'PORT': '3306',
    9. }
    10. }
  1. 安装Django需要的数据库驱动 mysqlclient
    1. pip install mysqlclient
  1. 接下来在创建模型之前,确定当前自己创建的应用已经在django中进行了配置
    web/web/settings.py
    1. INSTALLED_APPS = [
    2. 'django.contrib.admin',
    3. 'django.contrib.auth',
    4. 'django.contrib.contenttypes',
    5. 'django.contrib.sessions',
    6. 'django.contrib.messages',
    7. 'django.contrib.staticfiles',
    8. 'home'
    9. ]

Model模型的基本定义方式

  1. 创建模型类 应用的models.py文件中

    1. ```python from django.db import models

Create your models here.

定义学生 模型类 默认情况下,模型类的名字就是表的名字,通常是 应用名_模型类名

class Stu(models.Model):

  1. # 定义属性。就成为这个表的字段
  2. name = models.CharField(max_length=20)
  3. age = models.IntegerField(default=18)
  4. sex = models.CharField(max_length=1,default='男')
  1. 2.
  2. 生成迁移文件
  3. <br />运行manage.py文件,并给出指令,生成迁移文件
  4. ```shell
  5. # python3 manage.py makemigrations
  6. (venv) MacBook-Pro:web yc$ python3 manage.py makemigrations
  7. Migrations for 'home':
  8. home/migrations/0001_initial.py
  9. - Create model Stu
  1. 执行迁移
    运行manage.py文件,并给出指令,执行迁移文件
    在第一次执行项目的迁移时,django框架默认的应用中的迁移文件也会执行。
    1. # python3 manage.py migrate
    2. (venv) MacBook-Pro:web yc$ python3 manage.py migrate
    3. Operations to perform:
    4. Apply all migrations: admin, auth, contenttypes, home, sessions
    5. Running migrations:
    6. Applying contenttypes.0001_initial... OK
    7. Applying auth.0001_initial... OK
    8. Applying admin.0001_initial... OK
    9. Applying admin.0002_logentry_remove_auto_add... OK
    10. Applying admin.0003_logentry_add_action_flag_choices... OK
    11. Applying contenttypes.0002_remove_content_type_name... OK
    12. Applying auth.0002_alter_permission_name_max_length... OK
    13. Applying auth.0003_alter_user_email_max_length... OK
    14. Applying auth.0004_alter_user_username_opts... OK
    15. Applying auth.0005_alter_user_last_login_null... OK
    16. Applying auth.0006_require_contenttypes_0002... OK
    17. Applying auth.0007_alter_validators_add_error_messages... OK
    18. Applying auth.0008_alter_user_username_max_length... OK
    19. Applying auth.0009_alter_user_last_name_max_length... OK
    20. Applying auth.0010_alter_group_name_max_length... OK
    21. Applying auth.0011_update_proxy_permissions... OK
    22. Applying home.0001_initial... OK
    23. Applying sessions.0001_initial... OK
  1. 到数据库中查看这个执行后的结果 ```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 是我们自己定义的 模型类所对应和生成的表 +——————————————+

  1. <a name="0db6b8fb"></a>
  2. ### 在视图中调用模型进行数据操作
  3. <a name="814f0356"></a>
  4. #### 1.数据添加
  5. ```python
  6. # 数据的添加
  7. # 方法一,属性赋值
  8. # obj = Stu()
  9. # obj.name = '张三'
  10. # obj.age = 20
  11. # obj.sex = '男'
  12. # obj.save()
  13. # 方法二,关键字参数传递
  14. # data = {'name':'lisi','age':22,'sex':'女'}
  15. # obj = Stu(**data)
  16. # obj.save()

2.数据查询

  1. # 1 all. 查询所有数据
  2. # data = Stu.objects.all() # 结果集对象
  3. # 2 filter过滤器,带有条件的查询
  4. # data = Stu.objects.filter(sex='女')
  5. # <QuerySet [<Stu: Stu object (1)>, <Stu: Stu object (2)>, <Stu: Stu object (3)>]>
  6. # print(data)
  7. # for i in data:
  8. # print(i)
  9. # print(i.name)
  10. # 3 通过id获取数据. 注意,get方法只能返回一个数据对象,多了少了都报错
  11. # obj = Stu.objects.get(id=3)
  12. # print(obj)

3.数据修改

  1. obj = Stu.objects.get(id=3)
  2. obj.name = '王五'
  3. obj.save()

4.数据删除

  1. obj = Stu.objects.get(id=2)
  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,或者设置一个默认值

  1. <a name="8fa08039"></a>
  2. ##### 扩展作业
  3. MVT中的模型,视图,模版都已经给大家进行了讲解和简单的练习。
  4. 接下来给大家安排一个独立的练习题作业。
  5. **任务一:使用Django框架完成一个模块的开发**
  6. 任务分解:
  7. - 就是完成一个相同模型的 数据的增 删 改 查
  8. - 就类似之前学习mysql时的那个扩展作业
  9. - 最终实现一个django-web版本的用户管理模块
  10. - 模型设计,到模版页面到业务逻辑和路由全部自己独立完成。
  11. **任务二:去思考一个问题,思考一个电商中的订单表的结构**
  12. 如果合理的创建订单表去存储订单相关字段。
  13. 应该用什么字段,字段名,类型,等等。。。
  14. 思考中别忘了一个问题:
  15. 一个订单中可以购买2个a产品
  16. 也可以在一个订单中购买2a产品和1个b产品
  17. 作业提交:
  18. 作业一,把视图函数代码和模型类,写到一个word或者markdown中,以名字命名
  19. 作业二, 把订单的表结构写出来,顺便自己添加一些数据,形成文档。
  20. 9990977加大群,找小姐姐加微信交流群,发布到群里。
  21. <a name="6fc1f9cc"></a>
  22. #### mac系统在mysqlclient安装时出现的错误
  23. ![](./imgs/mysqlclient-error.png#alt=mysqlclient-error)
  24. **【问题分析】**
  25. 从上面的内容可以看出安装过程中加载不了目标库文件 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

  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”

  1. 【**解决问题**】
  2. 在命令行终端中执行后面两句 export,根据你的命令结果执行你自己的哦。

export LDFLAGS=”-L/usr/local/homebrew/opt/openssl/lib”export CPPFLAGS=”-I/usr/local/homebrew/opt/openssl/include”

  1. 重新安装mysqlclient

pip install mysqlclient ```