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

  1. class UserInfo(models.Model):
  2. name = models.CharField(max_length=32, null=True)
  3. age = models.IntegerField(null=True)
  4. class Private(models.Model):
  5. salary = models.CharField(max_length=32, null=True)
  6. sp = models.OneToOneField("UserInfo", null=True) #oneTooneField: 一对一, 默认要求该字段必须是唯一的 unique 外键关系

插入信息

  1. models.UserInfo.objects.create(name='张三',age=12)
  2. models.Private.objects.create(salary=100,sp_id=1)

查询

  1. #从母表查询子表中的数据
  2. #方法1:res = models.UserInfo.objects.filter(name='张三').first().private.salary #子表表名小写.子表字段名
  3. #方法2:res = models.UserInfo.objects.filter(name='张三').values('private__salary')
  1. #从子表查询母表信息
  2. #方法1:res = models.Private.objects.filter(salary='100').first().sp.name
  3. #方法2:res = models.Private.objects.values('sp__name'):

2.多对多(通过关系表)

models.py

  1. class Boy(models.Model):
  2. bname = models.CharField(max_length=30,null=True)
  3. class Girl(models.Model):
  4. gname = models.CharField(max_length=30,null=True)
  5. class Boy2Girl(models.Model):
  6. b = models.ForeignKey('Boy',null=True)
  7. g = models.ForeignKey('Girl',null=True)
  8. #联合唯一属性
  9. class Meta:
  10. unique_together=[
  11. ('b','g')
  12. ]

插入信息

  1. import random
  2. boys =[
  3. models.Boy(bname='男1'),
  4. models.Boy(bname='男2'),
  5. models.Boy(bname='男3'),
  6. models.Boy(bname='男4'),
  7. models.Boy(bname='男5'),
  8. models.Boy(bname='男6')
  9. ]
  10. res = models.Boy.objects.bulk_create(boys)
  11. girls =[
  12. models.Girl(gname='女1'),
  13. models.Girl(gname='女2'),
  14. models.Girl(gname='女3'),
  15. models.Girl(gname='女4'),
  16. models.Girl(gname='女5'),
  17. models.Girl(gname='女6'),
  18. models.Girl(gname='女7'),
  19. models.Girl(gname='女8'),
  20. ]
  21. models.Girl.objects.bulk_create(girls)
  22. a = [
  23. models.Boy2Girl(b_id=random.randint(1,6),g_id=1),
  24. models.Boy2Girl(b_id=random.randint(1,6),g_id=2),
  25. models.Boy2Girl(b_id=random.randint(1,6),g_id=3),
  26. models.Boy2Girl(b_id=random.randint(1,6),g_id=4),
  27. models.Boy2Girl(b_id=random.randint(1,6),g_id=5),
  28. models.Boy2Girl(b_id=random.randint(1,6),g_id=6),
  29. models.Boy2Girl(b_id=random.randint(1,6),g_id=7),
  30. models.Boy2Girl(b_id=random.randint(1,6),g_id=8),
  31. ]
  32. models.Boy2Girl.objects.bulk_create(a)

查询

  1. #通过关系表查询,查boy位男1对于的女的信息
  2. #方法1:res = models.Boy2Girl.objects.filter(b__bname='男1').values('g__gname')
  3. #方法2:
  4. res = models.Boy2Girl.objects.filter(b__bname='男1').all()
  5. for a in res:
  6. print(res.g.gname)
  7. #通过boy表查女的信息
  8. #方法1: res = models.Boy.objects.filter(bname='男1').values('boy2girl__g__gname')
  9. #方法2:
  10. res = models.Boy.objects.filter(bname='男1').all()
  11. for a in res:
  12. for b in a.boy2girl_set.all():
  13. print(b.g.gname)

3.多对多(不通过关系表)

models.py

  1. class Boy1(models.Model):
  2. bname = models.CharField(max_length=32, null=True)
  3. g = models.ManyToManyField('Girl', null=True)
  4. #他会生成一个boy1_g的表
  5. class Girl1(models.Model):
  6. gname = models.CharField(max_length=32, null=True)

插入信息

  1. boys =[
  2. models.Boy(bname='男1'),
  3. models.Boy(bname='男2'),
  4. models.Boy(bname='男3'),
  5. models.Boy(bname='男4'),
  6. models.Boy(bname='男5'),
  7. models.Boy(bname='男6')
  8. ]
  9. res = models.Boy1.objects.bulk_create(boys)
  10. #
  11. girls =[
  12. models.Girl(gname='女1'),
  13. models.Girl(gname='女2'),
  14. models.Girl(gname='女3'),
  15. models.Girl(gname='女4'),
  16. models.Girl(gname='女5'),
  17. models.Girl(gname='女6'),
  18. models.Girl(gname='女7'),
  19. models.Girl(gname='女8'),
  20. ]
  21. models.Girl1.objects.bulk_create(girls)

建立两者关系

  • 取出boy的对象
  • 再选择其中的g对象,再进行add添加|删除|查询girl的id

添加(add)

  1. models.Boy1.objects.filter(bname='男1').first().g.add(1,2,3,4,5,2) #会自动去重保持唯一性也不会因为相同而报错

删除(remove)

  1. models.Boy1.objects.filter(bname='男1').first().g.remove(1)

查询(all)

  1. models.Boy1.objects.filter(bname='男1').first().g.all()

清除(clear)

  1. 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数据类型对应属性

  1. null 数据库中字段是否可以为空
  2. db_column 数据库中字段的列名
  3. default 数据库中字段的默认值
  4. primary_key 数据库中字段是否为主键
  5. db_index 数据库中字段是否可以建立索引
  6. unique 数据库中字段是否可以建立唯一索引
  7. class Meta:
  8. ### 联合唯一索引
  9. unique_together=[
  10. ('b', 'g')
  11. ]
  12. #### 联合索引
  13. index_together = [
  14. ('b', 'g')
  15. ]

四.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'), ]

      )

django创建表单以及表单数据类型和属性的更多相关文章

  1. django 创建model(数据库表)失败

    在models.py中创建数据库表   from django.db import models # Create your models here. class Book(models.Model) ...

  2. Django基础(3)----模型层-单表操作,多表创建

    昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...

  3. MYSQL数据类型 表基本操作 表记录增删改 单表查询

    一.数据类型 常用的数据类型如下: 整数:int,bit 小数:decimal 字符串:varchar,char 日期时间: date, time, datetime 枚举类型(enum) 特别说明的 ...

  4. Django学习笔记(7)——单表操作和多表操作

    单表操作 1,创建模型 创建名为book的APP,在book下的models.py中创建模型: from django.db import models # Create your models he ...

  5. Python学习(三十四)—— Django之ORM之单表、联表操作

    一.单表查询API汇总 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 <3> get(**kw ...

  6. 5 第一个Django第4部分(表单和通用视图)

    上一节完成了视图编写,这一节为应用添加投票功能,也就是表单提交. 5.1编写一个简单的表单 5.2使用通用视图 5.3改良视图 5.1编写一个简单的表单 在网页设计中添加Form元素 polls/te ...

  7. Django - 请求与响应、表单、中间件、上下文处理器

    请求与响应篇 一.HttpRequest对象 服务器接收到http协议的请求后,会根据报文创建HttpRequest对象.视图函数的第一个参数(request)是HttpRequest对象在djang ...

  8. Django——11 状态保持 form表单 登陆注册样例

    Django 状态保持 用户状态例子 实现注册登陆实例 django forms 表单的使用 注册功能 登陆功能   状态保持cookie和session 1.http协议是无状态的:每次请求都是一次 ...

  9. Java 创建、填充PDF表单域

    表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加 ...

随机推荐

  1. 'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文件。

    一定要发现自己的问题不要盲目从众 1.把maven的安装包解压 2.配置环境变量 3.配置path路径 4.在dos下测试一下 结果出现:'mvn' 不是内部或外部命令,也不是可运行的程序 或批处理文 ...

  2. Mybatis打印SQL

    配置mybatis日志级别,打印SQL 1.方案一:配置日志级别 logging.level.org.springboot.demo.mapper=debug 其中org.springboot.dem ...

  3. PythonI/O进阶学习笔记_4.自定义序列类(序列基类继承关系/可切片对象/推导式)

    前言: 本文代码基于python3 Content: 1.python中的序列类分类 2. python序列中abc基类继承关系 3. 由list的extend等方法来看序列类的一些特定方法 4. l ...

  4. cssrelative

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  5. springboot 定时器 Schdule

    定时器:定时启动任务,执行代码 1.在启动类中加入注解: 2.创建一个类,并且在这个类上加入注解:@Component 3.定义一个方法,在方法上加入注解:@Scheduled(cron=" ...

  6. springboot---redis缓存的使用

    1.下载redis安装包,解压到电脑 2.启动redis 3.springboot  application.properties中配置redis缓存 spring.redis.host=127.0. ...

  7. 在C#一个程序中,将一个窗体中的数据传送到另一个窗体

    使用多个窗体搭建的程序,需要用到窗体间的数据传递,常用两种方法: 方法一 1,进入子窗体的Designer.cs,将子窗体中的私有控件控件定义为public 2.在主窗口程序Form1.cs中将子窗口 ...

  8. mybatis无法给带有下划线属性赋值问题

    https://blog.csdn.net/qq_33768099/article/details/69569561

  9. Autofac的AOP面向切面编程研究

    *:first-child { margin-top: 0 !important; } .markdown-body>*:last-child { margin-bottom: 0 !impor ...

  10. Build step 'Invoke top-level Maven targets' marked build as failure Finished解决

    最近用法 jenkins部署maven项目时候,突然出现Build step 'Invoke top-level Maven targets' marked build as failure Fini ...