django学习笔记01
原创博客地址:django学习笔记01
基于教程,刘江的博客教程Django教程:https://www.liujiangblog.com/course/django/87
第一章:模型层
1.1 模型和字段
FileField
ImageField
FilePathField
UUIDField
1.2 关系类型字段
一,一对多
外键要定义在‘多’的一方!
1 2 3 4 5 6 7 8 |
parent_comment = models.ForeignKey('self', on_delete=models.CASCADE) on_delete limit_choices_to related_name related_query_name to_field db_constraint swappable |
二、多对多(ManyToManyField)
symmetrical
默认情况下,Django中的多对多关系是对称的。
Django认为,如果我是你的朋友,那么你也是我的朋友,这是一种对称关系,Django不会为Person模型添加person_set属性用于反向关联。如果你不想使用这种对称关系,可以将symmetrical设置为False,这将强制Django为反向关联添加描述符。
through_fields
Membership模型中包含两个关联Person的外键,Django无法确定到底使用哪个作为和Group关联的对象。所以,在这个例子中,必须显式的指定through_fields参数,用于定义关系。
through_fields参数指定从中间表模型Membership中选择哪两个字段,作为关系连接字段。
db_table
ManyToManyField多对多字段不支持Django内置的validators验证功能。
null参数对ManyToManyField多对多字段无效!设置null=True毫无意义
三、一对一(OneToOneField)
1.3 字段的参数
null
该值为True时,Django在数据库用NULL保存空值。默认值为False。对于保存字符串类型数据的字段,请尽量避免将此参数设为True,那样会导致两种‘没有数据’的情况,一种是NULL,另一种是‘空字符串’。
blank
True时,字段可以为空。默认False。和null参数不同的是,null是纯数据库层面的,而blank是验证相关的,它与表单验证是否允许输入框内为空有关,与数据库无关。所以要小心一个null为False,blank为True的字段接收到一个空值可能会出bug或异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
choices class Student(models.Model): FRESHMAN = 'FR' SOPHOMORE = 'SO' JUNIOR = 'JR' SENIOR = 'SR' YEAR_IN_SCHOOL_CHOICES = ( (FRESHMAN, 'Freshman'), (SOPHOMORE, 'Sophomore'), (JUNIOR, 'Junior'), (SENIOR, 'Senior'), ) year_in_school = models.CharField( max_length=2, choices=YEAR_IN_SCHOOL_CHOICES, default=FRESHMAN, ) class Person(models.Model): SHIRT_SIZES = ( ('S', 'Small'), ('M', 'Medium'), ('L', 'Large'), ) name = models.CharField(max_length=60) shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES) p = Person(name="Fred Flintstone", shirt_size="L") p.shirt_size p.get_shirt_size_display() db_column db_index |
该参数接收布尔值。如果为True,数据库将为该字段创建索引。
1 2 |
db_tablespace default |
editable
如果设为False,那么当前字段将不会在admin后台或者其它的ModelForm表单中显示,同时还会被模型验证功能跳过。参数默认值为True。
error_messages
用于自定义错误信息。参数接收字典类型的值。字典的键可以是null、 blank、 invalid、 invalid_choice、 unique和unique_for_date其中的一个。
help_text
额外显示在表单部件上的帮助文本。使用时请注意转义为纯文本,防止脚本攻击。
primary_key
如果你没有给模型的任何字段设置这个参数为True,Django将自动创建一个AutoField自增字段,名为‘id’,并设置为主键。也就是id = models.AutoField(primary_key=True)。
如果你为某个字段设置了primary_key=True,则当前字段变为主键,并关闭Django自动生成id主键的功能。
另外,主键字段不可修改,如果你给某个对象的主键赋个新值实际上是创建一个新对象,并不会修改原来的对象。
unique
设为True时,在整个数据表内该字段的数据不可重复。
注意:对于ManyToManyField和OneToOneField关系类型,该参数无效。
unique_for_date
日期唯一。可能不太好理解。举个栗子,如果你有一个名叫title的字段,并设置了参数unique_for_date=”pub_date”,那么Django将不允许有两个模型对象具备同样的title和pub_date。有点类似联合约束。
unique_for_month
同上,只是月份唯一。
unique_for_year
同上,只是年份唯一。
verbose_name
为字段设置一个人类可读,更加直观的别名。
对于每一个字段类型,除了ForeignKey、ManyToManyField和OneToOneField这三个特殊的关系类型,其第一可选位置参数都是verbose_name。如果没指定这个参数,Django会利用字段的属性名自动创建它,并将下划线转换为空格。
下面这个例子的verbose name是”person’s first name”:
first_name = models.CharField(“person’s first name”, max_length=30)
下面这个例子的verbose name是”first name”:
first_name = models.CharField(max_length=30)
对于外键、多对多和一对一字字段,由于第一个参数需要用来指定关联的模型,因此必须用关键字参数verbose_name来明确指定。如下:
1.4 多对多中间表详解
1.5 模型的元数据Meta
abstract
app_label
base_manager_name
db_table
db_tablespace
default_manager_name
default_related_name
get_latest_by
managed
order_with_respect_to
ordering
permissions
default_permissions
proxy
required_db_features
required_db_vendor
select_on_save
indexes
unique_together
verbose_name
verbose_name_plural
label
label_lower
1.6 模型的继承
抽象基类,多表继承,代理模型
抽象基类中的abstract=True这个元数据不会被继承。也就是说如果想让一个抽象基类的子模型,同样成为一个抽象基类,那你必须显式的在该子模型的Meta中同样声明一个abstract = True;
有一些元数据对抽象基类无效,比如db_table,首先是抽象基类本身不会创建数据表,其次它的所有子类也不会按照这个元数据来设置表名。
警惕related_name和related_query_name参数
1 2 3 4 5 6 7 8 9 |
class Base(models.Model):m2m = models.ManyToManyField(OtherModel,related_name="%(app_label)s_%(class)s_related",related_query_name="%(app_label)s_%(class)ss",)class Meta:abstract = True |
如果一个Place对象同时也是一个Restaurant对象,你可以使用小写的子类名,在父类中访问它,
Meta和多表继承
由于父类和子类都在数据库内有物理存在的表,父类的Meta类会对子类造成不确定的影响,因此,Django在这种情况下关闭了子类继承父类的Meta功能。这一点和抽象基类的继承方式有所不同。
但是,还有两个Meta元数据特殊一点,那就是ordering和get_latest_by,这两个参数是会被继承的。因此,如果在多表继承中,你不想让你的子类继承父类的上面两种参数,就必须在子类中显示的指出或重写
多表继承和反向关联
三、 代理模型
声明一个代理模型只需要将Meta中proxy的值设为True。
四、 多重继承
Django的模型体系支持多重继承,就像Python一样。如果多个父类都含有Meta类,则只有第一个父类的会被使用,剩下的会忽略掉。
一般情况,能不要多重继承就不要,尽量让继承关系简单和直接,避免不必要的混乱和复杂。
请注意,继承同时含有相同id主键字段的类将抛出异常。为了解决这个问题,你可以在基类模型中显式的使用AutoField字段。
或者使用一个共同的祖先来持有AutoField字段,并在直接的父类里通过一个OneToOne字段保持与祖先的关系,如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Piece(models.Model):passclass Article(Piece):article_piece = models.OneToOneField(Piece, on_delete=models.CASCADE, parent_link=True)...class Book(Piece):book_piece = models.OneToOneField(Piece, on_delete=models.CASCADE, parent_link=True)...class BookReview(Book, Article):pass |
警告
在Python语言层面,子类可以拥有和父类相同的属性名,这样会造成覆盖现象。但是对于Django,如果继承的是一个非抽象基类,那么子类与父类之间不可以有相同的字段名!
比如下面是不行的!
1 2 3 4 5 |
class A(models.Model):name = models.CharField(max_length=30)class B(A):name = models.CharField(max_length=30) |
1.7 用包来组织模型
django学习笔记01相关推荐
- django 学习笔记
django 学习笔记 启动虚拟机: workon bj18_py3 创建一个项目: django-admin.py startproject mysite 启动开发用服务器:从外层项目 mysite ...
- JavaWeb黑马旅游网-学习笔记01【准备工作】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb黑马旅游网-学习笔记01[准备工作] JavaWeb黑马旅游网-学习笔记02[注册功能] JavaWeb黑马旅游网-学习笔记03[登陆和 ...
- JavaWeb-综合案例(用户信息)-学习笔记01【列表查询】
Java后端 学习路线 笔记汇总表[黑马程序员] JavaWeb-综合案例(用户信息)-学习笔记01[列表查询] JavaWeb-综合案例(用户信息)-学习笔记02[登录功能] JavaWeb-综合案 ...
- Servlet和HTTP请求协议-学习笔记01【Servlet_快速入门-生命周期方法、Servlet_3.0注解配置、IDEA与tomcat相关配置】
Java后端 学习路线 笔记汇总表[黑马程序员] Servlet和HTTP请求协议-学习笔记01[Servlet_快速入门-生命周期方法.Servlet_3.0注解配置.IDEA与tomcat相关配置 ...
- Tomcat学习笔记01【Web相关概念、Tomcat基本操作】
Java后端 学习路线 笔记汇总表[黑马程序员] Tomcat学习笔记01[Web相关概念.Tomcat基本操作][day01] Tomcat学习笔记02[Tomcat部署项目][day01] 目录 ...
- XML学习笔记01【xml_基础、xml_约束】
Java后端 学习路线 笔记汇总表[黑马程序员] XML学习笔记01[xml_基础.xml_约束][day01] XML学习笔记02[xml_解析][day01] 目录 01 xml_基础 今日内容 ...
- Bootstrap学习笔记01【快速入门、栅格布局】
Java后端 学习路线 笔记汇总表[黑马程序员] Bootstrap学习笔记01[快速入门.栅格布局][day01] Bootstrap学习笔记02[全局CSS样式.组件和插件.案例_黑马旅游网][d ...
- JavaScript学习笔记01【基础——简介、基础语法、运算符、特殊语法、流程控制语句】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- HTML/CSS学习笔记01【概念介绍、基本标签】
w3cschool菜鸟教程.CHM(腾讯微云):https://share.weiyun.com/c1FaX6ZD HTML/CSS学习笔记01[概念介绍.基本标签.表单标签][day01] HTML ...
最新文章
- MyBatis框架的文件配置
- Spring(AbstractRoutingDataSource)实现动态数据源切换
- 仓位 001 998 AUFNAHME不存在(L9009)
- linux宝塔面板配置可道云,使用宝塔面板配合可道云打造私有云
- 核心动画03-图标抖动.mp4
- cocos2d-iphone源码分析(2):Director
- SAP UI5 应用开发教程之二十六 - OData 服务配合 Mock 服务器的使用步骤详解
- 【学习笔记】应用层——电子邮件、万维网、HTTP协议
- 【英语学习】【Daily English】U02 Daily Routine L01 Sadly, my schedule is very tight.
- iDesktop点数据集构建DEM时三种插值方式的选择
- 第三百八十一节,Django+Xadmin打造上线标准的在线教育平台—xadmin全局配置
- QCC3020 单地址量产项目 功耗数据 电流测试数据
- teamtalk部署
- 高通APQ8009w LTR303_ALS 光感(sensor)兼容模式调试
- 注册表编辑已经被您的系统管理员停用
- 福家宝机器人,关于举办第六届宁夏青少年智能机器人竞赛的通知.doc
- PHP与ECMP,2019 NECMP东北音乐产业发展论坛在沈举行
- dB、dBm、dBc等概念的解释
- 基于闪电搜索算法的函数寻优算法
- stm32蓝牙模块通过手机和电脑双向通信
热门文章
- 抖音为什么能让人上瘾?
- sql server序列_SQL Server中的序列对象
- azure云数据库_配置Azure SQL数据库防火墙
- sql azure 语法_使用Azure Data Studio开发SQL Server数据库
- sp_getapplock_sp_getapplock和sp_releaseapplock存储过程概述
- Jmeter 获取、读取token 供其他 HTTP 请求调用
- 个人作业1——四则运算题目生成程序(基于java)
- Android优化方案之--Fragment的懒加载实现
- 性能测试用例、策略和方法
- STM32 学习总结2 ----利用中断来控制按键点灯、捕获功能练习