zoukankan      html  css  js  c++  java
  • django之DB操作

    先来区分一下什么是一对一、多对多

    一对一:子表从母表中选出一条数据一一对应,母表中选出来一条就少一条,子表不可以再选择母表中已被选择的那条数据;

    一对多:子表从母表中选出一条数据一一对应,但母表的这条数据还可以被其他子表数据选择;

    共同点是在admin中添加数据的话,都会出现一个select选框,但只能单选,因为不论一对一还是一对多,自己都是“一”;

    多对多总结:

      比如有多个孩子,和多种颜色;

      每个孩子可以喜欢多种颜色,一种颜色可以被多个孩子喜欢,对于双向均是可以有多个选择;

    应用场景

    一对一:一般用于某张表的补充,比如用户基本信息是一张表,但并非每一个用户都需要有登录的权限,不需要记录用户名和密码,此时,合理的做法就是新建一张记录登录信息的表,与用户信息进行一对一的关联,可以方便的从子表查询母表信息或反向查询;

    外键:有很多的应用场景,比如每个员工归属于一个部门,那么就可以让员工表的部门字段与部门表进行一对多关联,可以查询到一个员工归属于哪个部门,也可反向查出某一部门有哪些员工;

    多对多:如很多公司,一台服务器可能会有多种用途,归属于多个产品线当中,那么服务器与产品线之间就可以做成对多对,多对多在A表添加manytomany字段或者从B表添加,效果一致;

    demo 如下:

    class Business(models.Model):
        caption = models.CharField(max_length=32)
        code = models.CharField(max_length=32,null=True,default="SA")
    
    
    #一对多ForeignKey
    class Host(models.Model):
        nid = models.AutoField(primary_key=True)
        hostname = models.CharField(max_length=32,db_index=True)
        ip = models.GenericIPAddressField(protocol="ipv4", db_index=True)
        port = models.IntegerField()
        b = models.ForeignKey(to="Business", to_field='id')
    
    
    class hosts(models.Model):
        nid = models.AutoField(primary_key=True)
        hostname=models.CharField(max_length=32,db_index=True)
        ip = models.GenericIPAddressField(protocol="ipv4")
        port = models.IntegerField()
    
    
    #多对多, ManyToManyField(无法对第三张表进行直接操作)
    class Application(models.Model):
        name = models.CharField(max_length=32)
        r = models.ManyToManyField("hosts")
    
    
    #多对多,可以对第三表直接进行操作
    class HostToapp(models.Model):
        hobj = models.ForeignKey(to="hosts",to_field="nid")
        aobj = models.ForeignKey(to="Application", to_field="id")
    demo

    数据库操作

    app_name = request.POST.get('app_name')
    obj = models.Application.objects.create(name=app_name)
    host_list = request.POST.getlist('host_list')
    obj.r.add(*host_list)
    obj.r.remove(1)
    obj.r.remove(*host_list)
    obj.r.set(*host_list)
    print(obj.r.all())
  • 相关阅读:
    896. Monotonic Array单调数组
    865. Smallest Subtree with all the Deepest Nodes 有最深节点的最小子树
    489. Robot Room Cleaner扫地机器人
    JavaFX
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
    《Python CookBook2》 第一章 文本
  • 原文地址:https://www.cnblogs.com/patrick0715/p/6213743.html
Copyright © 2011-2022 走看看