资讯专栏INFORMATION COLUMN

Django基础之六(模型理论知识)

lmxdawn / 1877人阅读

摘要:在模型中添加是完全可选的,所有选项都不是必须的。一个模型的数据库表名称,由这个模型的应用名和模型类名称之间加上下划线组成。使用来表示随机排序。默认值为这个选项为时可以对数据库表进行或删除等操作。

Django模型理论知识 简介

Django模型所在的位置:

URL--->视图--->模型(mysql)

什么是模型:

模型就是数据的唯一的&权威的信息源

包含所存储的诗句的必要字段和行为(属性和方法)

一个模型对应一张表

如何编写模型:

模型:每个模型都用一个类表示,该类继承自django.db.models.Model。每个模型有多个类的属性变量,而每一个类的属性变量又都代表了数据库表中的一个字段
字段:每个字段通过Field类的一个实例表示 —— 例如字符字段CharField和日期字段DateTimeField。这种方法告诉Django,每个字段中保存着什么类型的数据
字段名:每个Field 实例的名字(例如username)就是字段的名字,并且是机器可读的格式。你将在Python代码中使用到它的值,并且你的数据库将把它用作表的列名
模型字段

文档

自增主键Field

默认情况下Django会给每个模型添加下面这个字段

 id = models.AutoField(primary_key=True)

如果Django看到你显式地设置了Field.primary_key, 就不会自动添加 id 列
每个模型只能有一个字段指定primary_key=True (无论是显式声明还是自动添加)

字段的自述信息

每个字段类型都接受一个可选的位置参数——字段的自述名,如果没有给定自述名,Django将根据字段的属性名称自动创建自述名——将属性名称的下划线替换成空格
ForeignKey、 ManyToManyField 和 OneToOneField 这三个可以使用verbose_name指定自述名

例如:自述名为:"person"s first name"
first_name = models.CharField("person"s first name", max_length=30)

例如:自述名为:"first name"
first_name = models.CharField(max_length=30)

字段选项

每个字段有一些特有的参数,例如,CharField(和它的派生类)需要max_length 参数来指定VARCHAR 数据库字段的大小

null

如果为True,Django将用NULL来在数据库中存储空值
默认值:False

blank

如果为True , 该字段允许不填
默认值:False

null是纯数据库范畴,而blank是数据验证范畴的
blank=True,表单验证允许该字段为空
blank=False,该字段就是必须的

choices

由二元组组成的一个可迭代对象(如列表或元组),用来给字段提供选择项,如果设置了choices, 默认的表单将是一个选择框,选择框的选择就是choices中的选项
  YEAR_IN_SCHOOL_CHOICES = (
     ("FR", "Freshman"),
     ("SO", "Sophomore"),
     ("JR", "Junior"),
     ("SR", "Senior"),
  )

default

字段的默认值,可以是一个值或者调用对象

primary_key

如果为True,那么这个字段就是模型的主键

unique

如果该值设置为True,这个字段的值在整张表中必须是唯一的

index

普通索引

更多

模型Meta选项

使用内部的class Meta 定义模型的元数据,例如:

from django.db import models
class User(models.Model):
      username = models.IntegerField()
      class Meta:
          ordering = ["username"]
模型元数据是“任何不是字段的数据”,比如排序选项(ordering),数据库表名(db_table)。在模型中添加class Meta是完全可选的,所有选项都不是必须的。
Meta选项列表

db_table:db_table是用于指定自定义数据库表名的

Django有一套默认的按照一定规则生成数据模型对应的数据库表名,如果你想使用自定义的表名,就通过这个属性指定
若不提供该参数, Django 会使用 app_name + "_" + module_name 作为表的名字
Django 会根据模型类的名称和包含它的应用的名称自动指定数据库表名称。一个模型的数据库表名称,由这个模型的“应用名” 和模型类名称之间加上下划线组成。
使用Meta类中的 db_table 参数来重写数据表的名称。
当你通过db_table覆写表名称时,强烈推荐使用小写字母给表命名

ordering:这个字段是告诉Django模型对象返回的记录结果集是按照哪个字段排序的

  class Meta:
      ordering = ["-order_date"]
它是一个字符串的列表或元组。每个字符串是一个字段名,前面带有可选的“-”前缀表示倒序。前面没有“-”的字段表示正序。使用"?"来表示随机排序。

  ordering = ["order_date"] # 按订单升序排列
  ordering = ["-order_date"] # 按订单降序排列,-表示降序
  ordering = ["?order_date"] # 随机排序,?表示随机
  ordering = ["-pub_date", "author"] # 对 pub_date 降序,然后对 author 升序

app_label

app_label这个选项只在一种情况下使用,就是你的模型类不在默认的应用程序包下的models.py文件中,这时候你需要指定你这个模型类是那个应用程序的

  class Meta:
      app_label="myapp"

get_last_by

由于Django的管理方法中有个lastest()方法,就是得到最近一行记录。如果你的数据模型中有 DateField 或 DateTimeField 类型的字段,你可以通过这个选项来指定lastest()是按照哪个字段进行选取的。
一个 DateField 或 DateTimeField 字段的名字. 若提供该选项, 该模块将拥有一个 get_latest() 函数以得到 "最新的" 对象(依据那个字段):
  class Meta:
      get_latest_by = "order_date"

verbose_name的意思很简单,就是给你的模型类起一个更可读的名字

  class Meta:
      verbose_name = "pizza"

managed:管理第三方库一定要设置成False

由于Django会自动根据模型类生成映射的数据库表,如果你不希望Django这么做,可以把managed的值设置为False。
默认值为True,这个选项为True时Django可以对数据库表进行 migrate或migrations、删除等操作。在这个时间Django将管理数据库中表的生命周期
如果为False的时候,不会对数据库表进行创建、删除等操作。可以用于现有表、数据库视图等,其他操作是一样的。

更多

数据库的迁移

迁移是Django用于同步你的发生改变的模型(添加一个字段,删除一个模型,等等)到你的数据库,实质上也是就是管理数据表的生命周期

迁移命令

makemigrations, 负责基于你的模型修改创建一个新的迁移
migrate, 负责执行迁移, 以及撤销和列出迁移的状态。
sqlmigrate, 展示迁移的sql语句

生成迁移文件

python manage.py makemigrations dashboard
会扫描和比较你当前迁移文件里面的版本,同时新的迁移文件会被创建

展示迁移的sql语句

python manage.py sqlmigrate dashboard 0007

数据迁移

python manage.py migrate dashboard

当模型和数据库字段不一致的问题

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/44976.html

相关文章

  • Python猫荐书系列:文也深度学习,理也深度学习

    摘要:本期猫荐书栏目系列之六,就以此为话题,推荐给大家两本书它们都叫深度学习,但是内容很不一样。事实上,第一本书被很多人誉为深度学习的圣经,知名度极高,有一个昵称叫作花书。 最近出了两件大新闻,相信大家可能有所耳闻。 我来当个播报员,给大家转述一下: 1、中国队在第 11 界罗马尼亚数学大师赛(RMM)中无缘金牌。该项赛事是三大国际赛事之一,被誉为中学奥数的最高难度。其中一道题,令中国队全军...

    suemi 评论0 收藏0
  • Python猫荐书系列:文也深度学习,理也深度学习

    摘要:本期猫荐书栏目系列之六,就以此为话题,推荐给大家两本书它们都叫深度学习,但是内容很不一样。事实上,第一本书被很多人誉为深度学习的圣经,知名度极高,有一个昵称叫作花书。 最近出了两件大新闻,相信大家可能有所耳闻。 我来当个播报员,给大家转述一下: 1、中国队在第 11 界罗马尼亚数学大师赛(RMM)中无缘金牌。该项赛事是三大国际赛事之一,被誉为中学奥数的最高难度。其中一道题,令中国队全军...

    LuDongWei 评论0 收藏0
  • Python猫荐书系列:文也深度学习,理也深度学习

    摘要:本期猫荐书栏目系列之六,就以此为话题,推荐给大家两本书它们都叫深度学习,但是内容很不一样。事实上,第一本书被很多人誉为深度学习的圣经,知名度极高,有一个昵称叫作花书。 最近出了两件大新闻,相信大家可能有所耳闻。 我来当个播报员,给大家转述一下: 1、中国队在第 11 界罗马尼亚数学大师赛(RMM)中无缘金牌。该项赛事是三大国际赛事之一,被誉为中学奥数的最高难度。其中一道题,令中国队全军...

    Dongjie_Liu 评论0 收藏0
  • django官方文档1.11编翻:首页

    摘要:源网页说明文档所有关于你应该且必须知道的。性能和优化概述的兼容性旨在兼容多种不同版本的支持的兼容性地理框架打算成为世界级的地理框架。其目标是尽可能简单地构建应用程序并利用空间使能数据的功能。 源网页:https://docs.djangoproject.co... django说明文档 所有关于django你应该且必须知道的。 第一步 你是否django编程新手,那就从此开始!从零开始...

    Michael_Lin 评论0 收藏0
  • JavaScript 工作原理之六-WebAssembly 对比 JavaScript 及其使用场景

    摘要:现在,我们将会剖析的工作原理,而最重要的是它和在性能方面的比对加载时间,执行速度,垃圾回收,内存使用,平台访问,调试,多线程以及可移植性。目前,是专门围绕和的使用场景设计的。目前不支持多线程。 原文请查阅这里,略有改动,本文采用知识共享署名 4.0 国际许可协议共享,BY Troland。 本系列持续更新中,Github 地址请查阅这里。 这是 JavaScript 工作原理的第六章...

    jay_tian 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<