需求

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")

Django--models连表构建的更多相关文章

  1. Django models多表操作

    title: Django models多表操作 tags: Django --- 多表操作 单独创建第三张表的情况 推荐使用的是使用values/value_list,selet_related的方 ...

  2. Django models 单表查询

    从数据库中查询出来的结果一般是一个集合,这个集合叫做 QuerySet 1. 查看Django QuerySet执行的SQL .query.__str__()或 .query属性打印执行的sql语句 ...

  3. django models的点查询/跨表查询/双下划线查询

    django models 在日常的编程中,我们需要建立数据库模型 而往往会用到表与表之间的关系,这就比单表取数据要复杂一些 在多表之间发生关系的情形下,我们如何利用models提供的API的特性获得 ...

  4. 第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理

    第三百八十节,Django+Xadmin打造上线标准的在线教育平台—将所有app下的models数据库表注册到xadmin后台管理 将一个app下的models数据库表注册到xadmin后台管理 重点 ...

  5. day20 Django Models 操作,多表,多对多

    1 Django models 获取数据的三种方式: 实践: viwes def business(request): v1 = models.Business.objects.all() v2 = ...

  6. Django之form表单详解

    构建一个表单 假设你想在你的网站上创建一个简单的表单,以获得用户的名字.你需要类似这样的模板: <form action="/your-name/" method=" ...

  7. url路由、模板语言、ajax、用django框架创建表

    1.后台管理的左侧菜单,默认只有第一个页签下面的选项是显示的,点了别的页签再显示别的页签下面的选项,问题是:点了任何菜单的选项后,左侧菜单又成了第一个页签的选项显示,别的页签隐藏,也就是左侧的菜单刷新 ...

  8. django models数据类型

    Django Models的数据类型 AutoField IntegerField BooleanField true/false CharField maxlength,必填 TextField C ...

  9. django models 类型整理 version:1.8.3

    django models 类型整理 version:1.8.3 网上百度到的最上面的一篇已经是11年的了,django变化很大,现在把1.8.3版的models类型大致整理了下贴出来 普通键部分 F ...

随机推荐

  1. Crontab中shell每分钟执行一次HDFS文件上传不执行的解决方案

    一.Crontab -e 加入输出Log */1 * * * * /qiwen_list/upload_to_hdfs.sh > /qiwen_list/mapred.log 2>& ...

  2. Selenium 3 -how to locate the chromedriver and geckodriver place?

    Maybe you met these exceptions sometimes: 1. Chrome Driver The path to the driver executable must be ...

  3. TCP : two different sockets sharing a port?

    A server socket listens on a single port. All established client connections on that server are asso ...

  4. ios7 UITableView 分割线在 使用selectedBackgroundView 选中时有些不显示

    UITableView  选中cell ,默认会有一个灰色的背景遮罩效果,这个灰色遮罩就是cell 自带的 selectedBackgroundView 我们可以设置selectedBackgroun ...

  5. 使用ClipboardUtils兼容API LEVEL 11以下实现复杂粘贴

    实现功能:复杂粘贴内容 问题描述:android.content.ClipboardManager在APILevel 11之后才可以使用,而我们目前还要兼容API Level 10(2.3.3) 解决 ...

  6. 搞不清FastCgi与PHP-fpm之间是个什么样的关系(转载)

    刚开始对这个问题我也挺纠结的,看了<HTTP权威指南>后,感觉清晰了不少. 首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者. ...

  7. C#实现IDispose接口

    .net的GC机制有两个问题:首先GC并不能释放所有资源,它更不能释放非托管资源.其次,GC也不是实时的,所有GC存在不确定性.为了解决这个问题donet提供了析构函数 public class Te ...

  8. Embeding Python & Extending Python with FFPython

    Introduction ffpython is a C++ lib, which is to simplify tasks that embed Python and extend Python. ...

  9. SAP ECC MM 配置文档

    SAP ECC 6.0 Configuration Document Materials Management (MM) Table of Content TOC \o \h \z 1. Genera ...

  10. Hadoop学习笔记(老版本,YARN之前),MapReduce任务Namenode DataNode Jobtracker Tasktracker之间的关系

    一.基本概念 在MapReduce中,一个准备提交执行的应用程序称为“作业(job)”,而从一个作业划分出的运行于各个计算节点的工作单元称为“任务(task)”.此外,Hadoop提供的分布式文件系统 ...