zoukankan      html  css  js  c++  java
  • Python自动化之一对多

    一对多

    建立一对多关系之后(也就是加了外键),会在字表里面多一个“外键字段_id”这个字段

    查询

    	#_*_coding:utf-8_*_
    from django.db import models
     
    # Create your models here.
     
    class Colors(models.Model):
        colors=models.CharField(max_length=10) #蓝色
        def __str__(self):
            return self.colors
     
    class Ball(models.Model):
        color=models.OneToOneField("Colors")  #与颜色表为一对一,颜色表为母表
        description=models.CharField(max_length=10) #描述
        def __str__(self):
            return self.description
     
    class Clothes(models.Model):
        color=models.ForeignKey("Colors")   #与颜色表为外键,颜色表为母表
        description=models.CharField(max_length=10) #描述
        def __str__(self):
            return self.description   
         
    class Child(models.Model):
        name=models.CharField(max_length=10)   #姓名  
        favor=models.ManyToManyField('Colors')    #与颜色表为多对多	
    
    
    外键表联合查询:
    
    #外键子表查询母表,与一对一子表查询母表形式一致
    #找到红裤衩所属的颜色表中的颜色--返回:红
    #写法1:
    

    通过子表查询母表,写法:"子表对象.母表表名的小写.母表字段名" ;通过Clothes表查到description为"小虎哥",查找到对应colors

    print(models.Clothes.objects.get(description="小虎哥").color.colors)  #返回红,通过子表查询母表,写法:"子表对象.母表表名的小写.母表字段名" ;通过Clothes表查到description为"小虎哥",查找到对应colors
    #写法2,反向从母表入手:
    

    通过子表查询母表,但形式上是从母表对象自身直接获取字段,写法:"母表.objects.get(子表名小写__子表字段="xxx").母表字段名" ;

    print(models.Colors.objects.get(clothes__description="小虎哥").colors)  #返回红,通过子表查询母表,但形式上是从母表对象自身直接获取字段,写法:"母表.objects.get(子表名小写__子表字段="xxx").母表字段名" ;效果和上边完全一致,另一种形式
    
    #外键母表查询子表,与一对一形式不同,因为母表为"多",不能像一对一一样通过.get().子表.子表字段的方式获取,但与多对多母表查询子表一致
    #找到颜色为红的所有服装--返回:[<Clothes: 大美女>, <Clothes: 小虎哥>]
    #写法1:
    color_obj=models.Colors.objects.get(colors="红")
    print(color_obj.clothes_set.all())  #注意:子表小写_set的写法,它实际上是一个QuerySet,可以用update,delete,all,filter等方法
    #写法2:
    print(models.Clothes.objects.filter(color=models.Colors.objects.get(colors="红")))
    #写法2简便写法(推荐):
    print(models.Clothes.objects.filter(color__colors="红"))  #写法:filter(子表外键字段__母表字段='过滤条件')
    #写法3:
    color_id=models.Colors.objects.get(colors="红").id  #通过母表获取到颜色为红的id
    print(models.Clothes.objects.filter(color_id=color_id))  #filter得到QuerySet,写法:filter(子表外键字段_母表主键=母表主键对象)
    

    #增添子表数据,形式与一对一一致
    #添加颜色为绿的服装:小帅哥
    #方法1:
    models.Clothes.objects.create(color=models.Colors.objects.get(colors="绿"),description="小帅哥")
    #方法1补充:
    models.Clothes.objects.create(color_id=models.Colors.objects.get(colors="绿").id,description="小帅哥")
    #方法2:
    c_obj=models.Clothes(color=models.Colors.objects.get(colors="绿"),description="小帅哥")
    c_obj.save()
    #方法3:字典方式录入..参考一对一
    

    #颜色为红的服装,description都更新为大美女
    #写法1:
    models.Clothes.objects.filter(color__colors="红").update(description="大美女")
    #写法2:
    models.Clothes.objects.filter(color_id=models.Colors.objects.get(colors="红").id).update(description="大美女")
    #写法3:
    colors_obj=models.Colors.objects.get(colors="红")
    colors_obj.clothes_set.filter(id__gte=1).update(description="大美女")
    #其他写法参照一对一的修改和外键的查询
    

    models.Clothes.objects.get(description="灰裙子").delete() #对象和QuerySet都有方法delete()
    models.Colors.objects.filter(colors="灰").delete()
    

    一对多示例2

    class UserGroup(models.Model):
        uid = models.AutoField(primary_key=True)
        caption = models.CharField(max_length=32,unique=True)
        ctime = models.DateTimeField(auto_now_add=True, null=True)
        uptime = models.DateTimeField(auto_now=True, null=True)
        # f = models.ForeignKey('Foo')
    #
    # user_list = Userinfo.objects.all()
    # for row in user_list:
    #     print(row.user_group_id)
    #     print(row.user_group.uid)
    #     print(row.user_group.caption)
    class UserInfo(models.Model):
        # id列,自增,主键
        # 用户名列,字符串类型,指定长度
        # 字符串、数字、时间、二进制
        username = models.CharField(max_length=32,blank=True,verbose_name='用户名')
        password = models.CharField(max_length=60, help_text='pwd')
        email = models.CharField(max_length=60)
        test = models.EmailField(max_length=19,null=True,error_messages={'invalid': '请输入密码'})
        # user_group_id 数字
        user_group = models.ForeignKey("UserGroup",to_field='uid') # (uid,catption,ctime,uptimew)
        user_type_choices = (
            (1, '超级用户'),
            (2, '普通用户'),
            (3, '普普通用户'),
        )
        user_type_id = models.IntegerField(choices=user_type_choices,default=1)
  • 相关阅读:
    js获取盒子scrollTop
    获取浏览器宽度,自适应屏幕
    js切割字符串
    有向图的欧拉路径POJ2337
    欧拉回路和欧拉路径
    HDU 4462(暴力枚举)
    HDU 4455(dp)
    鸽巢原理入门
    HDU 4819 Mosaic(二维线段树)
    POJ 1330 Nearest Common Ancestors(LCA模板)
  • 原文地址:https://www.cnblogs.com/wspblog/p/6170875.html
Copyright © 2011-2022 走看看