zoukankan      html  css  js  c++  java
  • 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_112233d+', message='又错误了', code='c2'),
        EmailValidator(message='又错误了', code='c3'), ]
        )

  • 相关阅读:
    hdu 1455 N个短木棒 拼成长度相等的几根长木棒 (DFS)
    hdu 1181 以b开头m结尾的咒语 (DFS)
    hdu 1258 从n个数中找和为t的组合 (DFS)
    hdu 4707 仓鼠 记录深度 (BFS)
    LightOJ 1140 How Many Zeroes? (数位DP)
    HDU 3709 Balanced Number (数位DP)
    HDU 3652 B-number (数位DP)
    HDU 5900 QSC and Master (区间DP)
    HDU 5901 Count primes (模板题)
    CodeForces 712C Memory and De-Evolution (贪心+暴力)
  • 原文地址:https://www.cnblogs.com/pythonywy/p/11360274.html
Copyright © 2011-2022 走看看