需求

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. Find Minimum in Rotated Sorted Array leetcode java

    题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...

  2. SNMP远程监控进程信息的OID

    最近有个项目需要用snmp远程监控进程信息.于是我查了一下资料. 一.资料 .1.3.6.1.2.1.25.4.2.1.1.iso.org.dod.internet.mgmt.mib-2.host.h ...

  3. 用CSS box-shadow画画

    原理:找一幅画,每隔5 pixel取一个点的RGB,在CSS中用box-shadow描绘出这个点 Python from PIL import Image if __name__ == '__main ...

  4. SVO实时全局光照优化(里程碑MK0):Sparse Voxel Octree based Global Illumination (SVO GI)

    完全自主实现,bloat-free.再次声明,这不是UE.U3D.CE.KlayGE! 老规矩,先贴图.后面有时间再补充描述. 1. 支持多跳间接全局光照2. 支持vxao/so.vxdiff/spe ...

  5. quick -- 创建精灵和动作

    local imgBg = display.newSprite("666666.jpg") :pos(display.cx, display.cy) :addTo(self) , ...

  6. android 中 ViewPager 的平常用法 ViewPager+ Views

    延续前面几个的经常用到的ViewPager, 直接加载各种不同的 View 工程目录: 代码: public class ViewActivity extends Activity { // 每个Vi ...

  7. 安装 LuaSocket

    如果你安装有 Lua 模块的安装和部署工具 -- LuaRocks,那么一条指令就能安装部署好 LuaSocket: luarocks install luasocket  

  8. WebService SendTimeout 超时问题

    System.TimeoutException: 请求通道在等待 00:01:00 以后答复时超时.增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值.分配给此操作的时间可能是更 ...

  9. 关于cnas培训

    关于cnas(2014-12-9----2014-12-12) 目的:完成内审相关知识培训,可以做一个合格的内审人员 过程: 1.为什么会存在实验室 2.iso9000是怎么产生的,以及存在的意义 3 ...

  10. 从javascript一道闭包面试题说开去

    这道题目比较经典了: var a = 1; function test(){ a = 2; return function(){ console.log(a); } var a = 3; } test ...