zoukankan      html  css  js  c++  java
  • Django--models连表构建


    需求

    models多表(一对多、多对多、一对一)的构建


    速查

    1、一对多

    1
    2
    3
    class User(models.Model):
        name = models.CharField(max_length=10)
        gender = models.ForeignKey(外键表名,to_field="连接的字段")

    2、多对多

    1
    2
    3
    class User(models.Model):
        name = models.CharField(max_length=10)
        hobby = models.ManyToManyField(Hobby)

    3、一对一

    1
    2
    3
    class User(models.Model):
        name = models.CharField(max_length=10)
        salary = models.OneToOneField(Salary,to_field="name")


    知识点

    1、连表结构

    • 一对多:models.ForeignKey(其他表),A表的一个字段对应B表的多个字段;

    • 多对多:models.ManyToManyField(其他表),A表中的一个字段对应B表中的多行(自动创建一关系表);

    • 一对一:models.OneToOneField(其他表),

    2、应用场景

    • 一对多:当一张表中创建一行数据时,有一个单选的下拉框(可以被重复选择)
      例如:创建用户信息时候,需要选择一个用户类型【普通用户】【金牌用户】【铂金用户】等。

    • 多对多:在某表中创建一行数据时,有一个可以多选的下拉框
      例如:创建用户信息,需要为用户指定多个爱好

    • 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了)
      例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足需求,需要为原来的表再添加5列数据


    详细

    1、一对多--ForeignKey

    1.1  默认连接id字段
    models.py
    1
    2
    3
    4
    5
    6
    7
    class Gender(models.Model):
        gender = models.CharField(max_length=2)
     
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        gender = models.ForeignKey(Gender)
    cmd

    Django--path > python manager.py makemigrations

    Django--path > python manager.py migrate

    db--gender表

    db--user表

    1.2  连接不是id的字段

    外键列,默认是用id来连接,这个字段名称自动改为“xx_id”列,如果使用某个字段连接,需要参数to-field:"连接的字段";​

    models.py

    1
    2
    3
    4
    5
    6
    7
    class Salary(models.Model):
        name = models.CharField(max_length=10,unique=True)
        salary = models.IntegerField()
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        salary = models.ForeignKey(Salary,to_field="name")
    db--salary(薪资)表

    db--user表

    2、多对多--ManyToManyField

    models.py
    1
    2
    3
    4
    5
    6
    class Hobby(models.Model):
        hobby = models.CharField(max_length=10)
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        hobby = models.ManyToManyField(Hobby)
    db--hobby(爱好)表

    db--user表

    user表中并没有创建hobby列,而是新建了一张表,记录了他们的对应关系。

    db--user_hobby

    3、一对一--OneToOneField

    外键的表每行只能被选择一次

    models.py
    1
    2
    3
    4
    5
    6
    7
    8
    class Salary(models.Model):
        name = models.CharField(max_length=10,unique=True)
        salary = models.IntegerField()
         
    class User(models.Model):
        name = models.CharField(max_length=10)
        age = models.IntegerField()
        salary = models.OneToOneField(Salary,to_field="name")





















  • 相关阅读:
    第二次结对作业
    第二次编程作业
    第一次编程作业
    第一篇随笔
    个人总结
    用例图设计
    第二次个人编程作业
    第一次个人编程作业
    第一次博客作业
    个人总结-以梦为马,砥砺前行
  • 原文地址:https://www.cnblogs.com/daliangtou/p/5310139.html
Copyright © 2011-2022 走看看