ORM模型多表逻辑创建:

以图书和作者关系模型为例:

models.py

from django.db import models

'''

一本书只能被一个出版社出版; 一个出版社可以出版多本书;

一个作者可以写多本书; 一个作者唯一对应自己的信息描述

一本书可以有多个作者

id不指定,orm自动创建字段为id的主键: id=models.AutoField(primary_key=True)

'''

   

# 出版社表

class Publish(models.Model):

publish_name = models.CharField(max_length=40)

publish_addr = models.CharField(max_length=48)

  

# 书籍表(与出版社多对一,与作者多对对)

class Book(models.Model):

book_name = models.CharField(max_length=40)

book_price = models.DecimalField(max_digits=6, decimal_places=2)

# 参数to外键指向的类(references表),to_filed外键关联条件(on字段)

    book_publisher = models.ForeignKey(to='Publish', to_field='id'# 外键多对一,默认级联删除,表中字段默认加了_id(book_publisher_id)

  

    '''

    #关联id字段,可以不写,默认就是关联主键

    # book_publisher=models.ForeignKey(to='Publish')

       

    # 关联类(表)可以不用关键字to指定,直接写默认会找到(通过字符串反射)

    # book_publisher=models.ForeignKey('Publish')   

   

    #可取消级联,前提必须设置该字段允许为空

    book_publisher = models.ForeignKey(to='Publish', to_field='id', null=True, on_delete=models.SET_NULL)

    或者直接设置:db_constraint= False也可设置不级联的效果

    '''

    author = models.ManyToManyField(to='Author'# 书籍和作者多对多,自动生成一个新表,字段有默认id,两个类名小写加_id,默认表名为:类名小写+_属性名(book_book_author,下文会讲到手动创建这张表的两种方法

# 作者信息表

class AuthorDetail(models.Model):

author_telephone = models.IntegerField(max_length=11)

author_addr = models.CharField(max_length=48)

author_more = models.CharField(max_length=100)

    

# 作者表(与作者信息表一对一,与书籍表多对多)

class Author(models.Model):

author_name = models.CharField(max_length=12)

author_birth = models.DateField()

author_detail = models.OneToOneField('AuthorDetail',)  # 外键一对一(sql中的foreign key + unique

  

      Tool>Run manage.py Task:makemigrations-->migrate

       

多对多关系第三张表创建:

以上多对多关系的书籍作者信息表是在书籍中设置多对多ManyToManyField属性系统自动创建的,还有其他两种手动创建的方式:

1)手动创建方式一

from django.db import models

class Book(models.Model):

book_name = models.CharField(max_length=40)

class Author(models.Model):

author_name = models.CharField(max_length=40)

# 手动创建第三张表

class Book_Author(models.Model):

book = models.ForeignKey(to='Book')

author = models.ForeignKey(to='Author')

class Meta:

unique_together = ('book', 'author')

2)手动创建方式二(手动创建第三张表,无法使用orm提供的add,remove,clear,set方法,但在第三张表有额外信息是常用)

from django.db import models

class Book(models.Model):

book_name = models.CharField(max_length=40)

# ManyToManyField设置属性关联,指定第三张表

    author=models.ManyToManyField(to='Author',through='Book_Author',through_fields=('book','author'))

class Author(models.Model):

author_name = models.CharField(max_length=40)

# 手动创建第三张表

class Book_Author(models.Model):

book=models.ForeignKey(to='Book')

author=models.ForeignKey(to='Author')

class Meta:

unique_together=('book','author')

(3)自动创建(第三张表自动创建只含有三字段,可以使用orm提供的方法)

from django.db import models

class Book(models.Model):

book_name = models.CharField(max_length=40)

# ManyToManyField设置属性关联,自动创建第三张表

    author=models.ManyToManyField(to='Author')

class Author(models.Model):

author_name = models.CharField(max_length=40)

orm自动创建的第三张表可以直接使用orm提供的add、remove、clear、set方法,手动创建的第三张表不行。

关系表创建使用的类和参数:

(1)一对一:models.OneToOneField()

to

设置要关联的表名(类)

to='Author'

to_field

设置要关联的表字段(类属性)

to_field='id'

on_delete

同ForeignKey字段级联删除(默认)

on_delete=models.SET_NULL
(取消级联,前提该字段null=True)

(2)多对一:models.ForeignKey()

to

设置要关联的表

to_field

设置要关联的表的字段

related_name

反向操作时,使用的字段名,用于代替原反向查询时的'表名_set'

related_query_name

反向查询操作时,使用的连接前缀,用于替换表名

on_delete

当删除关联表中的数据时,当前表与其关联的行的行为

(3)多对多:models.ManyToManyField()

to

设置要关联的表

related_name

同ForeignKey字段

related_query_name

同ForeignKey字段。

through

在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系。但我们也可以手动创建第三张表来管理多对多关系,此时就需要通过through来指定第三张表的表名

through_fields

设置关联的字段(两张关联表的类名小写元组)

db_table

默认创建第三张表时,数据库中表的名称。

创建表时的元信息:

ORM对应的类里面包含另一个Meta类(上述手动创建第三张表),而Meta类封装了一些数据库的信息。主要字段如下:

db_table

ORM在数据库中的表名默认是 app_类名,可以通过db_table可以重写表名。db_table = 'book_model'

index_together

联合索引。

unique_together

联合唯一索引

ordering

指定默认按什么字段排序。   ordering = ['pub_date',]    只有设置了该属性,我们查询到的结果才可以被reverse(),否则是能对排序了的结果进行反转(order_by()方法排序过的数据)

关系表级联删除on_delete

on_delete当删除关联表中的数据时,当前表与其关联的行的行为 :

models.CASCADE

删除关联数据,与之关联也删除

models.DO_NOTHING

删除关联数据,引发错误IntegrityError

models.PROTECT

删除关联数据,引发错误ProtectedError

models.SET_NULL

删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空)

models.SET_DEFAULT

删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值)

models.SET

删除关联数据,
    a. 与之关联的值设置为指定值,设置:models.SET(值)
    b. 与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)

 

Django之ORM多表关系创建的更多相关文章

  1. Django 通过 ORM 实现表的CRUD

    Django 通过 ORM 实现表的CRUD 单表的创建 修改 setting.py 文件 DATABASES = { 'default': { 'ENGINE': 'django.db.backen ...

  2. 5.Django|模型层--多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr php 人民出版社 北京 pyth ...

  3. Python学习---django之ORM语法[对象关系映射]180124

    ORM语法[对象关系映射] ORM: 用面向对象的方式去操作数据库的创建表以及增删改查等操作. 优点:1 ORM使得我们的通用数据库交互变得简单易行,而且完全不用考虑该死的SQL语句.快速开发. 2 ...

  4. Django之ORM跨表操作

    Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...

  5. Python之路【第三十篇】:django 模型层-多表关系

    多表操作 文件为 ---->  orm2 数据库表关系之关联字段与外键约束 一对多Book id title price publish email addr 1 php 100 人民出版社 1 ...

  6. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

  7. python——Django(ORM连表操作)

    千呼万唤始出来~~~当当当,终于系统讲了django的ORM操作啦!!!这里记录的是django操作数据库表一对多.多对多的表创建及操作.对于操作,我们只记录连表相关的内容,介绍增加数据和查找数据,因 ...

  8. Django【第7篇】:Django之ORM跨表操作(聚合查询,分组查询,F和Q查询等)

    django之跨表查询及添加记录 一:创建表 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-many); ...

  9. django之orm单表查询

    这几天重新学习了一下django的orm,以此作为记录来分享. Part1:修改配置,生成表 在写数据和查数据之前,首先先得把django配置一下,具体配置如下: 1.先在公共项目的settings中 ...

随机推荐

  1. 2019-2020-1 20199325《Linux内核原理与分析》第五周作业

    第五周作业主要是选择一个系统调用(13号系统调用time除外),使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用,在实验楼Linux虚拟机环境下完成实验. 系统调用的列表参见 http ...

  2. 2019-2020-1 20199329《Linux内核原理与分析》第十二周作业

    <Linux内核原理与分析>第十二周作业 一.本周内容概述: 通过编程理解 Set-UID 的运行机制与安全问题 完成实验楼上的<SET-UID程序漏洞实验> 二.本周学习内容 ...

  3. 小米Note 10 Lite海外发布 无缘中国市场

    [TechWeb]5月1日消息,昨日晚间,小米Note 10 Lite在海外亮相.小米市场部副总经理臧智渊在微博透露,小米Note 10 Lite 6GB+64GB版售价349欧元(约合人民币2700 ...

  4. Android Resourse

    为什么80%的码农都做不了架构师?>>>   使用情景: 实现帧动画步骤的控制,这样动态的获取Drawable资源对应的R id,播放到那一步就加载到哪一步 private void ...

  5. Vue Cli 3 报错:router is not defined

    报错内容: 报错原因: 代码全部放在了路由配置的main.js文件里,router没有定义,使用的时候报undefined 解决方法: 把router.beforeEach放在main.js里面

  6. 【kafka KSQL】游戏日志统计分析(1)

    [kafka KSQL]游戏日志统计分析(1) 以游戏结算日志为例,展示利用KSQL对日志进行统计分析的过程. 启动confluent cd ~/Documents/install/confluent ...

  7. 谈谈Java的线程池设计

    在实际项目中,如果因为想异步执行暂时性的任务而不断创建线程是很浪费资源的事情(当一个任务执行完后,线程也没用了).这种情况下,最好是将任务提交给线程池执行. 所谓池,就是将管理某一种资源,对资源进行复 ...

  8. 2018年要学习的10大Python Web框架

    通过为开发人员提供应用程序开发结构,框架使开发人员的生活更轻松.他们自动执行通用解决方案,缩短开发时间,并允许开发人员更多地关注应用程序逻辑而不是常规元素. 在本文中,我们分享了我们自己的前十大Pyt ...

  9. Centos7网络配置( 网关、dns、ip地址配置)

    0.前提:设置VMware的虚拟网络编辑器 子网和网关设置   虚拟网络编辑器 1.配置DNS(可忽略) $vim /etc/resolv.conf nameserver 192.168.0.1 2. ...

  10. 解决vue页面刷新或者后退参数丢失的问题

    原文链接: 点我 在商城类的项目中,会经常遇到列表数据筛选查询的情景,当要打开某一项的详情页或者暂时离开列表页,再返回(后退时),选择的筛选条件会全部丢失,辛辛苦苦选择好的条件全没了,还得重新选择,如 ...