zoukankan      html  css  js  c++  java
  • Django

    模型(Model)

    • 模型是提供数据信息的数据库接口。
    • 模型是数据的唯一的,确定的信息源。它包含你所储存数据的必要字段和行为。
    • 通常,每个模型对应数据库中唯一的一张表。每个模型的实例对应数据表中的一条记录
    • 模型说明:
      • 每个模型都是一个Python的类,每个模型都是django.db.models.Model的子类。
      • 每一个模型属性都代表数据库中的一个表。
      • 通过所有这一切,Django的为你提供一个自动生成的数据库访问API;

    1.ORM框架

    • ORM(对象关系映射)即对象关系映射,它允许你使用类和对象对数据库进行交互(使用类和对象和使用SQL一样且更方便各种操作)。
    • ORM
    Object Relationship Mapping
      对象    关系         映射
    • 三大特征:
    1. 表到类的映射
    2. 数据类型的映射
    3. 关系映射

    2.模型示例(操作步骤)

    (1)添加一个应用程序  $ python3 manage.py startapp 应用程序名

    (2)添加模型类并注册应用程序(假设创建一个bookstore的应用程序) 

    # file : bookstore/models.py
    from django.db import models
    
    class Book(models.Model):
        title = models.CharField("书名", max_length=50, default='')
        price = models.DecimalField('定价', max_digits=7, decimal_places=2, default=0.0)
    
    ############
    
    # file : setting.py
    INSTALLED_APPS = [
        ...
        'bookstore',
    ]

    (3)迁移生成脚本文件bookstore/migrations/0001_initial.py并进行迁移

    $ python3 manage.py makemigrations
    $ python3 manage.py migrate 
    #终端操作
    $ python3 manage.py makemigrations
    Migrations for 'bookstore':
    bookstore/migrations/0001_initial.py
        - Create model Book
    $ python3 manage.py migrate
    Operations to perform:
    Apply all migrations: admin, auth, bookstore, contenttypes, sessions
    Running migrations:
    Applying bookstore.0001_initial... OK

    (4)查看数据表(是否迁移成功)

    $ mysql -u root -p
    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mygoods            |
    | mysql              |
    | mywebdb            |
    | onlybuyp           |
    | performance_schema |
    | sys                |
    | test_db            |
    +--------------------+
    8 rows in set (0.00 sec)
    
    mysql> use mywebdb
    Reading table information for completion of table and column names
    You can turn off this feature to get a quicker startup with -A
    
    Database changed
    mysql> show tables;
    +----------------------------+
    | Tables_in_mywebdb          |
    +----------------------------+
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | bookstore_book             |  <<== 新加表
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    +----------------------------+
    11 rows in set (0.00 sec)
    
    mysql> desc bookstore_book;
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | title | varchar(50)  | NO   |     | NULL    |                |
    | price | decimal(7,2) | NO   |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+
    3 rows in set (0.00 sec)
    查看数据库 

    (5)表bookstore_book即为模型Book类对应的数据表

    • d为主键,当设定主键时会自动添加id字段为主键
    • 如果更新模型类models.py中的内容时需要运行makemigrations和迁移子命名来更新和同步数据库
    • 在开发阶段如果同步数据库出错。用sql> drop database 数据库名删除数据库后重新迁移数据库
    • 在xxx_app / migrations / *。py下的文件是自动生成的迁移脚本文件,可以手动删除且在下一次迁移时自动生成

    3.编写模型类模型

    模型类需继承自django.db.models.Model

    (1)模型的语法规范

    from django.db import models
    class CLASSNAME(models.Model):
        NAME = models.FIELD_TYPE(FIELD_OPTIONS)

    (2)班级名称

    • 实体类名,表名组成一部分,建议类名首字母大写
    • 默认表名组成规范:
      • 应用名称_className

    (3)名称

    • 类属性名,映射回数据库就是字段名

    (4)FIELD_TYPE

    • 字段类型:映射到表中的字段的类型

    4.FIELD_TYPE类型及含义

    (1)BooleanField()

    • 数据库类型:TINYINT(1)
    • 编程语言中:使用真或假来表示值
    • 在数据库中:使用1或0来表示具体的值

    (2)CharField()

    • 数据库类型:V​​ARCHAR
    • 注意:必须要指定MAX_LENGTH参数值 

    (3)DateField()

    • 数据库类型:日期
    • 作用:表示日期
    • 编程语言中:使用字符串来表示具体值
    • 参数:
      • DateField.auto_now:每次保存对象时,自动设置该字段为当前时间(取值:是/否)。
      • DateField.auto_now_add:当对象第一次被创建时自动设置当前时间(取值:真/假)。
      • DateField.default:设置当前时间(取值:字符串格式时间如:'2019-6-1')。
      • 以上三个参数只能多选一

    (4)DateTimeField字段()

    • 数据库类型:日期时间(6)
    • 作用:表示日期和时间
    • auto_now_add =真

    (5)DecimalField()

    • 数据库类型:十进制(X,Y) 
    • 编程语言中:使用小数表示该列的值
    • 在数据库中:使用小数
    • 参数:
      • DecimalField.max_digits:位数总数,包括小数点后的位数。该值必须大于等于decimal_places。
      • DecimalField.decimal_places:小数点后的数字数量
    money=models.DecimalField(
        max_digits=7,
        decimal_places=2,
        default=0.0
    )

    (6)FloatField()

    • 数据库类型:双
    • 编程语言中和数据库中都使用小数表示值

    (7)EmailField()

    • 数据库类型:V​​ARCHAR
    • 编程语言和数据库中使用字符串

    (8)IntegerField() 

    • 数据库类型:INT
    • 编程语言和数据库中使用整数 

    (9)URLField()

    • 数据库类型:V​​ARCHAR(200)
    • 编程语言和数据库中使用字符串

    (10)ImageField的()

    • 数据库类型:V​​ARCHAR(100)
    • 作用:在数据库中为了保存图片的路径
    • 编程语言和数据库中使用字符串
    • upload_to:指定图片的上传路径在后台上传时会自动的将文件保存在指定的目录下
    image=models.ImageField(
        upload_to="static/images"
    )

    (11)文本域()

    • 数据库类型:LONGTEXT
    • 作用:表示不定长的字符数据

    文档参考https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-types

    5.字段选项

    FIELD_OPTIONS

      字段选项,指定创建的列的额外的信息field_options

      允许出现多个字段选项,多个选项之间使用,隔开 

    (1)首要的关键:primary_key=True

      如果设置为True,则表示该列为主键,如果指定一个字段为主键,则此数库表不会创建ID字段

    (2)空白:blank=Flase

      设置为真时,字段可以为空。设置为False时,字段是必须填写的。字符型字段CharField和TextField是用空字符串来存储空值的。默认值是False。

    (3)空值:null=Ture

      如果设置为True,则表示该列值允许为空。日期型,时间型和数字型字段不接受空字符串。所以设置IntegerField,DateTimeField字段型字段可以为空时,需要将空(blank),空(null)均设为真(True)。

      默认为False,如果此选项为false,建议加入默认(default)选项来设置默认值

    (4)默认:delault=''

      设置所在列的默认值,如果字段选项空=假建议添加此项

    (5)db_index

      如果设置为True,则表示为该列增加索引

    (6)独特unique

      如果设置为True,则表示该字段在数据库中的值必须是唯一(不能重复出现的)

    (7)db_column

      指定列的名称,如果不指定的话则采用属性名作为列名

    (8)verbose_name

      设置此字段在管理界面上的显示名称。

    # 创建一个属性,表示用户名称,长度30个字符,必须是唯一的,不能为空,添加索引
    
    name = models.CharField(max_length=30, unique=True, 
    null=False, db_index=True)

    文档参见:https://docs.djangoproject.com/en/1.11/ref/models/fields/#field-options

  • 相关阅读:
    分享的选择
    @contextmanager 另外一种实现上下文的方法(含yield 生成器)
    Linux ☞ Good good study,day day up
    Linux常用命令
    python 新手遇到的问题
    Pyqt 基础功能
    redis安装使用
    python 对任意文件(jpg,png,mp3,mp4)base64的编码解码
    PHP7.* AES的加密解密
    Ubuntu宝塔面板设置网站 Apache Server API为Apache 2.0 Handler模式
  • 原文地址:https://www.cnblogs.com/maplethefox/p/11235409.html
Copyright © 2011-2022 走看看