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)
  • 相关阅读:
    day25:接口类和抽象类
    vue1
    How the weather influences your mood?
    机器学习实验方法与原理
    How human activities damage the environment
    Slow food
    Brief Introduction to Esports
    Massive open online course (MOOC)
    Online learning in higher education
    Tensorflow Dataset API
  • 原文地址:https://www.cnblogs.com/wspblog/p/6170875.html
Copyright © 2011-2022 走看看