Flask接口签名sign原理与实例代码浅析
227
2022-08-31
Django(part34)--一对多映射(django映射数据库)
学习笔记,仅供参考
文章目录
数据表关联关系映射
一对多映射
外键关联ForeignKey
构造函数
举个例子
数据表关联关系映射
一对多映射
一对多是表示现实事物间存在的一对多的对应关系。比如,一个学生只能属于一个班级,一个班级可以有多个学生;一本图书只能属于一个出版社,一个出版社允许出版多本书。
语法
一个A类对象可以关联多个B类对象
class A(model.Model): passclass B(model.Model): 属性 = models.ForeignKey(A模型类, ...)
外键关联ForeignKey
构造函数
ForeignKey(to, on_delete, **options)
参数
on_delete
models.CASCADE #级联删除,若设置此参数值,则当主对象被删除时,同时删除与其关联的从属对象。models.PROTECT #如果主对象存在关联对象时,我们删除主对象,就会抛出ProtectedError以阻止其被删除;SET_NULL #当删除主对象时,从属对象指向nullSET_DEFAULT #将ForeignKey设置为其默认值;必须设置ForeignKey的默认值。
**options是常用的字段选项
nullunique#等等
举个例子
定义一对多类
models.py
from django.db import models# Create your models here.class Publisher(models.Model): name = models.CharField("出版社名", max_length = 50,null = True) booknumber = models.PositiveIntegerField("初版书籍总量", default = 0) tele = models.CharField("联系电话", max_length = 11, null = False) class Meta: db_table = "china_publisher" verbose_name = "ChinaPublisher" verbose_name_plural = "ChinaPublishers" def __str__(self): string = "出版社:%s" % (self.name) return stringclass Book(models.Model): title = models.CharField("书名", max_length = 30) exfacPrice = models.DecimalField("出厂价", max_digits = 6, decimal_places = 2, default = 0) price = models.DecimalField("售价", max_digits = 6, decimal_places = 2, default = 0) pub = models.ForeignKey(Publisher, on_delete = models.CASCADE , null=True) def __str__(self): string = "书名:%s" % (self.title) return string
创建一对多的对象
打开Django shell,敲入如下代码:
from bookstore import modelspub1 = models.Publisher.objects.create(name='中国人民大学出版社', tele = "62511329", booknumber = 22000)models.Book.objects.create(title='统计学', pub=pub1)models.Book.objects.create(title='多元统计分析', pub=pub1)models.Book.objects.create(title='回归分析', pub=pub1)pub2 = models.Publisher.objects.create(name='高等教育出版社', tele = "82080802", booknumber = 12000)models.Book.objects.create(title='数学分析', pub=pub2)models.Book.objects.create(title='高等代数', pub=pub2)
查询
通过多查一:
#通过一本书找到对应的出版社abook = models.Book.objects.get(title='统计学')print(abook.title, '的出版社是:', abook.pub.name)
输出:
In [2]: abook = models.Book.objects.get(title='统计学') ...: print(abook.title, '的出版社是:', abook.pub.name) ...:统计学 的出版社是: 中国人民大学出版社
通过一查多:
#通过出版社查询对应的书pub1 = models.Publisher.objects.get(name='中国人民大学出版社')books = pub1.book_set.all() #通过book_set获取pub1对应的多个Book对象#相当于#books = models.Book.objects.filter(pub=pub1) print("清华大学出版社的书有:")for book in books: print(book.title)
输出:
In [3]: #通过出版社查询对应的书 ...: pub1 = models.Publisher.objects.get(name='中国人民大学出版社') ...: books = pub1.book_set.all() ...: #通过book_set获取pub1对应的多个Book对象 ...: #相当于 ...: #books = models.Book.objects.filter(pub=pub1) ...: print("清华大学出版社的书有:") ...: for book in books: ...: print(book.title) ...:清华大学出版社的书有:统计学多元统计分析回归分析
我们看一下mywebdb数据库中china_publisher数据表:
mysql> select * from china_publisher;+----+--------------------+------------+----------+| id | name | booknumber | tele |+----+--------------------+------------+----------+| 1 | 中国人民大学出版社 | 22000 | 62511329 || 2 | 高等教育出版社 | 12000 | 82080802 |+----+--------------------+------------+----------+2 rows in set (0.00 sec)
再看一下mywebdb数据库中bookstore_book数据表:
mysql> select * from bookstore_book;+----+-------------------+------------+-------+--------+| id | title | exfacPrice | price | pub_id |+----+-------------------+------------+-------+--------+| 1 | Djangoweb开发实战 | 0.00 | 0.00 | NULL || 2 | python | 0.00 | 0.00 | NULL || 3 | R | 0.00 | 0.00 | NULL || 5 | 算法 | 0.00 | 0.00 | NULL || 6 | 集体智慧编程 | 0.00 | 0.00 | NULL || 8 | 统计学 | 0.00 | 0.00 | 1 || 9 | 多元统计分析 | 0.00 | 0.00 | 1 || 10 | 回归分析 | 0.00 | 0.00 | 1 || 11 | 数学分析 | 0.00 | 0.00 | 2 || 12 | 高等代数 | 0.00 | 0.00 | 2 |+----+-------------------+------------+-------+--------+10 rows in set (0.01 sec)
bookstore_book数据表的pub_id字段关联了china_publisher数据表中的id字段,所以pub_id=1表示中国人民大学出版社,pub_id=2表示高等教育出版社。
最后,我们启动服务,并向select * from bookstore_book;+----+-------------------+------------+-------+--------+| id | title | exfacPrice | price | pub_id |+----+-------------------+------------+-------+--------+| 1 | Djangoweb开发实战 | 0.00 | 0.00 | NULL || 2 | python | 0.00 | 0.00 | NULL || 3 | R | 0.00 | 0.00 | NULL || 5 | 算法 | 0.00 | 0.00 | NULL || 6 | 集体智慧编程 | 0.00 | 0.00 | NULL || 8 | 统计学 | 0.00 | 0.00 | 1 || 9 | 多元统计分析 | 0.00 | 0.00 | 1 || 10 | 回归分析 | 0.00 | 0.00 | 1 || 11 | 数学分析 | 0.00 | 0.00 | 2 || 12 | 高等代数 | 0.00 | 0.00 | 1 |+----+-------------------+------------+-------+--------+10 rows in set (0.00 sec)
很好!记录已经被更新!
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~