Django-orm多表操作

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语句是:
    SELECT app01_mypublisher.name, app01_mybook.title FROM app01_mypublisher LEFT OUTER JOIN app01_mybook ON (app01_mypublisher.id = app01_mybook.publisher_id) WHERE app01_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)
image.png
image.png
  • 通过第一条记录第一个作者创建图书和出版社
    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)
image.png
  • 第七个用户增加关联图书表中关于财务的这几本书
    author_obj = models.Myauthor.objects.get(id=7)
    book_obj = models.Mybook.objects.filter(title__contains="财务")
    author_obj.book.add(*book_obj)
image.png
  • 添加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)
image.png

remove()

从关联对象集中移除执行的model对象

  • 第七个用户中删除ID=4的对应图书
author_obj = models.Myauthor.objects.get(id=7)
    author_obj.book.remove(4)
image.png

clear()从关联对象集中移除一切对象。

  • 移除七个用户中对应的所有图书
   author_obj = models.Myauthor.objects.get(id=7)
    author_obj.book.clear()
image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,794评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,050评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,587评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,861评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,901评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,898评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,832评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,617评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,077评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,349评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,483评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,199评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,824评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,442评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,632评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,474评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,393评论 2 352

推荐阅读更多精彩内容

  • 一 **** ORM模型介绍 Ⅰ* ORM,全称Object Relational Mapping,中文叫做对象关...
    幼姿沫阅读 445评论 0 0
  • Django 中有一个强大的功能,就是ORM,他可以不写sql语句,使用python语法,即可操作数据库。当然也有...
    清风徐来_简阅读 421评论 0 1
  • django1.6中文文档django1.11官网文档django2.中文官方文档 一、查询的一般操作 下面有13...
    NewForMe阅读 1,199评论 0 0
  • 查询数据 数据库的查询需要使用管理器对象进行 通过 MyModel.objects 管理器方法调用查询接口方法说明...
    乐智由我阅读 550评论 0 1
  • 一.单表操作增删改查:①Objects管理器,里面封装着增删改查的所有方法.查:models.类名.objects...
    wit92阅读 166评论 0 0