Django(part34)--一对多映射(django映射数据库)

网友投稿 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小时内删除侵权内容。

上一篇:mybatis TypeHandler注入spring的依赖方式
下一篇:Django(part26)--修改及删除记录(django 删除)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~