前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >django创建表单以及表单数据类型和属性

django创建表单以及表单数据类型和属性

作者头像
小小咸鱼YwY
发布2019-09-11 14:40:11
7590
发布2019-09-11 14:40:11
举报
文章被收录于专栏:python-爬虫python-爬虫

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
代码语言:javascript
复制
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 外键关系
插入信息
代码语言:javascript
复制
models.UserInfo.objects.create(name='张三',age=12)
models.Private.objects.create(salary=100,sp_id=1)
查询
代码语言:javascript
复制
#从母表查询子表中的数据

#方法1:res = models.UserInfo.objects.filter(name='张三').first().private.salary #子表表名小写.子表字段名
#方法2:res = models.UserInfo.objects.filter(name='张三').values('private__salary')
代码语言:javascript
复制
#从子表查询母表信息
#方法1:res = models.Private.objects.filter(salary='100').first().sp.name

#方法2:res = models.Private.objects.values('sp__name'):

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

models.py
代码语言:javascript
复制
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')
        ]
插入信息
代码语言:javascript
复制
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)
查询
代码语言:javascript
复制
#通过关系表查询,查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
代码语言:javascript
复制
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)
插入信息
代码语言:javascript
复制
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)

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

删除(remove)

代码语言:javascript
复制
models.Boy1.objects.filter(bname='男1').first().g.remove(1)

查询(all)

代码语言:javascript
复制
models.Boy1.objects.filter(bname='男1').first().g.all()

清除(clear)

代码语言:javascript
复制
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数据类型对应属性

代码语言:javascript
复制
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'), ] )

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-08-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 08.15自我总结
  • 关于django的表单不同关系之间的创建
    • 一.不同关系之间的创建
      • 1.一对一
      • 2.多对多(通过关系表)
      • 3.多对多(不通过关系表)
      • 4.一对多
    • 二.mysql与djamgo-orm数据类型对应关系
      • 三.mysql与djamgo-orm数据类型对应属性
        • 四.djamgo只在admin中生效的数据类型
          • 五.djamgo只在admin中生效的属性
          相关产品与服务
          数据库
          云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档