ForeignKey操作
源数据表:
class Mypublisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
class Mybook(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to="Mypublisher")
表Mypublisher与Mybook是一对多的关系,我们一般是在多的一方建立外键。
正向访问(由 Mybook,访问Mypublisher)
- 列出所有书的及对应的出版社
book_obj = models.Mybook.objects.all()
for i in book_obj:
print(i.title,i.publisher.name)
运行结果:
python3教程 清华教育出版社
Excel教程 人民教育出版社
VB教程 人民教育出版社
玩转财务大数据 清华教育出版社
融资其实并不难 长江教育出版社
Access教程 人民邮电出版社
SQL SERVER教程 人民教育出版社
企业合理节税 吉林大学出版社
- 列出第一本书及对应的出版社
book_obj = models.Mybook.objects.first()
print(book_obj.title,book_obj.publisher.name)
运行结果:
python3教程 清华教育出版社
以上为对象查找,也可以用字段直接查找
- 列出id大于2小于5的书及对应的出版社
book_obj = models.Mybook.objects.filter(id__gt=2,id__lt=5).values_list(
"title","publisher__name")
print(book_obj)
运行结果:
<QuerySet [('VB教程', '人民教育出版社'), ('玩转财务大数据', '清华教育出版社')]>
反向访问(由 Mypublisher,访问Mybook)
第一种方法:mybook(首字小写)_set()
- 列出所有出版社及对应的书籍
publisher_obj = models.Mypublisher.objects.all()
for i in publisher_obj:
for n in i.mybook_set.all():
print(i.name,n.title)
运行结果:
人民教育出版社 Excel教程
人民教育出版社 VB教程
人民教育出版社 SQL SERVER教程
清华教育出版社 python3教程
清华教育出版社 玩转财务大数据
长江教育出版社 融资其实并不难
人民邮电出版社 Access教程
吉林大学出版社 企业合理节税
- 列出人民教育出版社及对应的书籍
publisher_obj = models.Mypublisher.objects.filter(name__contains="人民教育")
for i in publisher_obj:
for n in i.mybook_set.all():
print(i.name,n.title)
运行结果:
人民教育出版社 Excel教程
人民教育出版社 VB教程
人民教育出版社 SQL SERVER教程
第二种方法:命名法,publisher = models.ForeignKey(to="Mypublisher",related_name="books")
class Mybook(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to="Mypublisher",related_name="books")
python manage.py makemigrations
python manage.py migrate
- 列出所有出版社及对应的书籍
publisher_obj = models.Mypublisher.objects.all()
for i in publisher_obj:
for n in i.books.all():
print(i.name,n.title)
#因为数据表数据误清空,数据重新录入,所以跟上面显示结果不同,属于正常情况.
运行结果
人民教育出版社 零基础学python
人民教育出版社 Access在财务中应用
人民教育出版社 财务报表分析
清华教育出版社 python教程
清华教育出版社 企业节税
长江教育出版社 VB教程
长江教育出版社 财务管理学
人民邮电出版社 筹资原来这么简单
人民邮电出版社 EXCEL HOME
吉林大学出版社 SQL SERVER 教程
吉林大学出版社 高级财务会计
- 列出ID为1,3,5的出版社并对应的书籍
SQL语句是:
SELECTapp01_mypublisher
.name
,app01_mybook
.title
FROMapp01_mypublisher
LEFT OUTER JOINapp01_mybook
ON (app01_mypublisher
.id
=app01_mybook
.publisher_id
) WHEREapp01_mypublisher
.id
IN (1, 3, 5) LIMIT 21; args=(1, 3, 5)
publisher_obj = models.Mypublisher.objects.filter(id__in=[1,3,5]).values_list(
"name","books__title")
print(publisher_obj)
运行结果:
<QuerySet [('人民教育出版社', '零基础学python'),
('人民教育出版社', 'Access在财务中应用'),
('人民教育出版社', '财务报表分析'),
('长江教育出版社', 'VB教程'),
('长江教育出版社', '财务管理学'),
('吉林大学出版社', 'SQL SERVER 教程'),
('吉林大学出版社', '高级财务会计')]>
ManyToManyField多对多操作
"关联管理器"是在一对多或者多对多的关联上下文中使用的管理器。
- 根椐作者表关联到所有与作者相关的图书及出版社名称
authors_obj = models.Myauthor.objects.all()
for author_obj in authors_obj:
# print(author_obj.name,author_obj.book.all())
for i in author_obj.book.all():
print(author_obj.name,i.title,i.publisher.name)
运行结果:
黄志伟 零基础学python 人民教育出版社
黄志伟 python教程 清华教育出版社
黄志伟 Access在财务中应用 人民教育出版社
黄志伟 电脑维修进阶课程 清华教育出版社
小布什 python教程 清华教育出版社
小布什 Access在财务中应用 人民教育出版社
小布什 VB教程 长江教育出版社
小布什 电脑维修课程 清华教育出版社
奥巴马 财务报表分析 人民教育出版社
郭杰 零基础学python 人民教育出版社
郭杰 Access在财务中应用 人民教育出版社
李白 企业节税 清华教育出版社
李白 筹资原来这么简单 人民邮电出版社
李白 电脑维修进阶课程v1 清华教育出版社
李世民 VB教程 长江教育出版社
李世民 企业节税 清华教育出版社
它存在于下面两种情况:
外键关系的反向查询
多对多关联关系
简单来说就是当 点后面的对象 可能存在多个的时候就可以使用以下的方法。
源数据表
class Mypublisher(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
class Mybook(models.Model):
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publisher = models.ForeignKey(to="Mypublisher",related_name="books")
class Myauthor(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
book = models.ManyToManyField(to="Mybook")
create()创建一个新的对象,保存对象,并将它添加到关联对象集之中,返回新创建的对象。直白的理解就是通过Myauthor创建一个作者对象,通过这个作者新建一个出版社和图书名称,从而形成Myauthor、Mybook及Mypublisher关联
- 通过Myauthor表中名为小布什的作者创建一个新的图书和出版社
author_obj = models.Myauthor.objects.filter(name__contains="布什")
for i in author_obj:
i.book.create(title="电脑维修课程",publisher_id= 2)
- 通过第一条记录第一个作者创建图书和出版社
author_obj = models.Myauthor.objects.first()
author_obj.book.create(title="电脑维修进阶课程",publisher_id= 2)
- 通过第五个用户创建图书和出版社
author_obj = models.Myauthor.objects.get(id=5)
author_obj.book.create(title="电脑维修进阶课程v1",publisher_id= 2)
add()
把指定的model对象添加到关联对象集中。
- 添加对象
- 第六个用户增加关联图书表中第七本书
author_obj = models.Myauthor.objects.get(id=5)
book_obj = models.Mybook.objects.get(id=7)
author_obj.book.add(book_obj)
- 第七个用户增加关联图书表中关于财务的这几本书
author_obj = models.Myauthor.objects.get(id=7)
book_obj = models.Mybook.objects.filter(title__contains="财务")
author_obj.book.add(*book_obj)
- 添加id
第六个作者关联Mybook书第六本书
author_obj = models.Myauthor.objects.get(id=6)
author_obj.book.add(6)
set()更新model对象的关联对象。重新设置
- 重新设置第七个用户关联ID=1,4,6 的书
author_obj = models.Myauthor.objects.get(id=7)
book_obj = models.Mybook.objects.filter(id__in=[1,4,6])
author_obj.book.set(book_obj)
remove()
从关联对象集中移除执行的model对象
- 第七个用户中删除ID=4的对应图书
author_obj = models.Myauthor.objects.get(id=7)
author_obj.book.remove(4)
clear()从关联对象集中移除一切对象。
- 移除七个用户中对应的所有图书
author_obj = models.Myauthor.objects.get(id=7)
author_obj.book.clear()