django创建表单以及表单数据类型和属性
08.15自我总结
关于django的表单不同关系之间的创建
一.不同关系之间的创建
1.一对一
举例
母表:userinfo
id | name | age |
---|---|---|
1 | 张三 | 12 |
2 | 李四 | 58 |
字表:private
id | salary | sp_id |
---|---|---|
1 | 100 | 1 |
2 | 400 | 2 |
models.py
class UserInfo(models.Model):
name = models.CharField(max_length=32, null=True)
age = models.IntegerField(null=True)
class Private(models.Model):
salary = models.CharField(max_length=32, null=True)
sp = models.OneToOneField("UserInfo", null=True) #oneTooneField: 一对一, 默认要求该字段必须是唯一的 unique 外键关系
插入信息
models.UserInfo.objects.create(name='张三',age=12)
models.Private.objects.create(salary=100,sp_id=1)
查询
#从母表查询子表中的数据
#方法1:res = models.UserInfo.objects.filter(name='张三').first().private.salary #子表表名小写.子表字段名
#方法2:res = models.UserInfo.objects.filter(name='张三').values('private__salary')
#从子表查询母表信息
#方法1:res = models.Private.objects.filter(salary='100').first().sp.name
#方法2:res = models.Private.objects.values('sp__name'):
2.多对多(通过关系表)
models.py
class Boy(models.Model):
bname = models.CharField(max_length=30,null=True)
class Girl(models.Model):
gname = models.CharField(max_length=30,null=True)
class Boy2Girl(models.Model):
b = models.ForeignKey('Boy',null=True)
g = models.ForeignKey('Girl',null=True)
#联合唯一属性
class Meta:
unique_together=[
('b','g')
]
插入信息
import random
boys =[
models.Boy(bname='男1'),
models.Boy(bname='男2'),
models.Boy(bname='男3'),
models.Boy(bname='男4'),
models.Boy(bname='男5'),
models.Boy(bname='男6')
]
res = models.Boy.objects.bulk_create(boys)
girls =[
models.Girl(gname='女1'),
models.Girl(gname='女2'),
models.Girl(gname='女3'),
models.Girl(gname='女4'),
models.Girl(gname='女5'),
models.Girl(gname='女6'),
models.Girl(gname='女7'),
models.Girl(gname='女8'),
]
models.Girl.objects.bulk_create(girls)
a = [
models.Boy2Girl(b_id=random.randint(1,6),g_id=1),
models.Boy2Girl(b_id=random.randint(1,6),g_id=2),
models.Boy2Girl(b_id=random.randint(1,6),g_id=3),
models.Boy2Girl(b_id=random.randint(1,6),g_id=4),
models.Boy2Girl(b_id=random.randint(1,6),g_id=5),
models.Boy2Girl(b_id=random.randint(1,6),g_id=6),
models.Boy2Girl(b_id=random.randint(1,6),g_id=7),
models.Boy2Girl(b_id=random.randint(1,6),g_id=8),
]
models.Boy2Girl.objects.bulk_create(a)
查询
#通过关系表查询,查boy位男1对于的女的信息
#方法1:res = models.Boy2Girl.objects.filter(b__bname='男1').values('g__gname')
#方法2:
res = models.Boy2Girl.objects.filter(b__bname='男1').all()
for a in res:
print(res.g.gname)
#通过boy表查女的信息
#方法1: res = models.Boy.objects.filter(bname='男1').values('boy2girl__g__gname')
#方法2:
res = models.Boy.objects.filter(bname='男1').all()
for a in res:
for b in a.boy2girl_set.all():
print(b.g.gname)
3.多对多(不通过关系表)
models.py
class Boy1(models.Model):
bname = models.CharField(max_length=32, null=True)
g = models.ManyToManyField('Girl', null=True)
#他会生成一个boy1_g的表
class Girl1(models.Model):
gname = models.CharField(max_length=32, null=True)
插入信息
boys =[
models.Boy(bname='男1'),
models.Boy(bname='男2'),
models.Boy(bname='男3'),
models.Boy(bname='男4'),
models.Boy(bname='男5'),
models.Boy(bname='男6')
]
res = models.Boy1.objects.bulk_create(boys)
#
girls =[
models.Girl(gname='女1'),
models.Girl(gname='女2'),
models.Girl(gname='女3'),
models.Girl(gname='女4'),
models.Girl(gname='女5'),
models.Girl(gname='女6'),
models.Girl(gname='女7'),
models.Girl(gname='女8'),
]
models.Girl1.objects.bulk_create(girls)
建立两者关系
- 取出boy的对象
- 再选择其中的g对象,再进行add
添加
|删除
|查询
girl的id
添加(add)
models.Boy1.objects.filter(bname='男1').first().g.add(1,2,3,4,5,2) #会自动去重保持唯一性也不会因为相同而报错
删除(remove)
models.Boy1.objects.filter(bname='男1').first().g.remove(1)
查询(all)
models.Boy1.objects.filter(bname='男1').first().g.all()
清除(clear)
models.Boy1.objects.filter(bname='男1').first().g.clear() #清除所有
注意点
add进行添加时候如果有会自动去重,他自带联合唯一的效果
4.一对多
https://www.cnblogs.com/pythonywy/p/11353202.html看这里
二.mysql与djamgo-orm数据类型对应关系
数据类型 | mysql | djamgo-orm |
---|---|---|
数字 | tinyint | 不存在 |
- | smallint | SmallIntegerField(有符号) PositiveSmallIntegerField(没符号) |
- | mediumint | 不存在 |
- | int (unsigned) | IntegerField(有符号)PositiveIntegerField(没符号) |
- | bigint | BigIntegerField(有符号) PositiveBigIntegerField(没符号) |
- | decimal | DecimalField |
- | float | FloatField |
- | double | 不存在 |
字符串 | char | 不存在 |
- | varchar | CharField |
- | text | TextField |
时间日期 | date | DateField |
- | datetime | DateTimeField |
- | timestamp | 不存在 |
三.mysql与djamgo-orm数据类型对应属性
null 数据库中字段是否可以为空
db_column 数据库中字段的列名
default 数据库中字段的默认值
primary_key 数据库中字段是否为主键
db_index 数据库中字段是否可以建立索引
unique 数据库中字段是否可以建立唯一索引
class Meta:
### 联合唯一索引
unique_together=[
('b', 'g')
]
#### 联合索引
index_together = [
('b', 'g')
]
四.djamgo只在admin中生效的数据类型
- EmailField(CharField):
字符串类型
对应信息是不是邮箱格式进行验证 - IPAddressField(Field):
字符串类型
,Django Admin以及ModelForm中提供验证 IPV4 机制 - GenericIPAddressField(Field):
字符串类型
,Django Admin以及ModelForm中提供验证 Ipv4和Ipv6- 参数:
- protocol:用于指定Ipv4或Ipv6, 'both',"ipv4","ipv6"
- unpack_ipv4: 如如果指定为True,则输入::ffff:192.0.2.1时候,可解析为192.0.2.1,开启刺功能,需要protocol="both"
- 参数:
- URLField(CharField):
字符串类型
,Django Admin以及ModelForm中提供验证 URL - SlugField(CharField):
字符串类型
,Django Admin以及ModelForm中提供验证支持 字母、数字、下划线、连接符(减号) - CommaSeparatedIntegerField(CharField):
字符串类型
,格式必须为逗号分割的数字 - UUIDField(Field):
字符串类型
,Django Admin以及ModelForm中提供对UUID格式的验证 - FilePathField(Field):
字符串
,Django Admin以及ModelForm中提供读取文件夹下文件的功能- 参数:
- path:文件路径
- match=None:正则匹配
- recursive=False:递归下面的文件夹
- allow_files=True:允许文件
- allow_folders=False:允许文件夹
- 参数:
- ImageField(FileField):
字符串类型
路径保存在数据库,文件上传到指定目录- 参数:
- upload_to = "" : 上传文件的保存路径
- storage = None:存储组件,默认django.core.files.storage.FileSystemStorage
- ImageField(FileField):上传图片的高度保存的数据库字段名(字符串)
- height_field=None:上传图片的宽度保存的数据库字段名(字符串)
- 参数:
五.djamgo只在admin中生效的属性
verbose_name:Admin中显示的字段名称
blank:Admin中是否允许用户输入为空
editable:Admin中是否可以编辑
help_text:Admin中该字段的提示信息
choices:Admin中显示选择框的内容,用不变动的数据放在内存中从而避免跨表操作
- 如:gf = models.IntegerField(choices=[(0, '何穗'),(1, '大表姐'),],default=1)
error_messages: 自定义错误信息(字典类型),从而定制想要显示的错误信息;
- from django.core.validators import RegexValidator
from django.core.validators import EmailValidator,URLValidator,DecimalValidator,
MaxLengthValidator,MinLengthValidator,MaxValueValidator,MinValueValidator
如:
test = models.CharField(
max_length=32,
error_messages={
'c1': '优先错信息1',
'c2': '优先错信息2',
'c3': '优先错信息3',
},
validators=[
RegexValidator(regex='root_\d+', message='错误了', code='c1'),
RegexValidator(regex='root_112233\d+', message='又错误了', code='c2'),
EmailValidator(message='又错误了', code='c3'), ]
)
- from django.core.validators import RegexValidator
django创建表单以及表单数据类型和属性的更多相关文章
- django 创建model(数据库表)失败
在models.py中创建数据库表 from django.db import models # Create your models here. class Book(models.Model) ...
- Django基础(3)----模型层-单表操作,多表创建
昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...
- MYSQL数据类型 表基本操作 表记录增删改 单表查询
一.数据类型 常用的数据类型如下: 整数:int,bit 小数:decimal 字符串:varchar,char 日期时间: date, time, datetime 枚举类型(enum) 特别说明的 ...
- Django学习笔记(7)——单表操作和多表操作
单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...
- Python学习(三十四)—— Django之ORM之单表、联表操作
一.单表查询API汇总 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kw ...
- 5 第一个Django第4部分(表单和通用视图)
上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...
- Django - 请求与响应、表单、中间件、上下文处理器
请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...
- Django——11 状态保持 form表单 登陆注册样例
Django 状态保持 用户状态例子 实现注册登陆实例 django forms 表单的使用 注册功能 登陆功能 状态保持cookie和session 1.http协议是无状态的:每次请求都是一次 ...
- Java 创建、填充PDF表单域
表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...
随机推荐
- vmware vsphere client 创建虚拟机
浏览器访问https://192.168.120.29 用户名:administrator@zhcs.com 密码: Deyi123456! 说明:此案例为创建linux的Centos7的操作系统的 ...
- SpannableString设置文本背景色
参考内容: http://blog.csdn.net/harvic880925/article/details/38984705 http://blog.it985.com/14433.html 1. ...
- SoloLear_C# Tutorial_Contents
一.Basic Concepts 基本概念 二.Conditionals and Loops 条件语句和循环 三.Methods 方法 四.Classes&Objects 类&对象 五 ...
- MYSQL之查询篇
2. 数据库操作 数据库在创建以后最常见的操作便是查询 2.1 查询 为了便于学习和理解,我们预先准备了两个表分别是stduents表和classes表两个表的内容和结构如下所示 students表的 ...
- Day4 总结
- ThinkPHP 5.x远程命令执行漏洞复现
ThinkPHP 5.x远程命令执行漏洞复现 一.漏洞描述 2018年12月10日,ThinkPHP官方发布了安全更新,其中修复了ThinkPHP5框架的一个高危漏洞: https://blog.th ...
- OAuth2.0 RFC 6749 中文
英文原版:https://tools.ietf.org/html/rfc6749 转自:https://github.com/jeansfish/RFC6749.zh-cn 一.简介 在传统的客户端- ...
- Java网络编程--Netty中的责任链
Netty中的责任链 设计模式 - 责任链模式 责任链模式(Chain of Responsibility Pattern)是一种是行为型设计模式,它为请求创建了一个处理对象的链.其链中每一个节点都看 ...
- mybatis简单入门介绍
mybatis入门 简介 什么是mybatis? MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及 ...
- 为RecyclerView定制可滑动的Item
最近项目有需要弄一个可以像手机QQ会话页一样可以滑动的小菜单,每一个Item当用户在向左滑动的时候右侧会出现一个小菜单当时就想在也不是很难心想着找个开源的使用就好呢,但是我的项目是用的Recycler ...