美文网首页
Django创建表单以及表单数据类型和属性

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

作者: 25岁学Python | 来源:发表于2020-01-10 15:49 被阅读0次

    关于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 外键关系
    
    
    推荐Python大牛在线分享技术 扣qun:855408893
    
    领域:web开发,爬虫,数据分析,数据挖掘,人工智能
    
    零基础到项目实战,7天学习上手做项目
    
    

    插入信息

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

    相关文章

      网友评论

          本文标题:Django创建表单以及表单数据类型和属性

          本文链接:https://www.haomeiwen.com/subject/aemyoctx.html