Django(9)ORM多表实例(二)

简介: Django(9)ORM多表实例(二)

三、关联管理器——对象调用


  • 前提:


多对多:需要双向均有关联管理器


一对多:只有多的那个类的对象需要关联管理器,也就是只有反向才有

注意:一对多只能反向


  • 语法格式:


正向:属性名称


反向:小写类名+_set


  • 常用方法:


1、add()

add()主要用于多对多,把指定的模型对象添加到关联对象集(对象表)中

注意:add()在一对多,即外键中,只能通过传入对象的方式不能通过传入id的方式


*[]的使用,下面是传入对象的方式

# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    book_obj = models.Book.objects.get(id=2)
    author_list = models.Author.objects.filter(id__gt=2)
    book_obj.authors.add(*author_list)  #将id大于2的作者对象添加到这本书的作者集合中
    return HttpResponse("ok")
  • 访问测试


a048eb0fd0474514932593c068c01276.png

查看数据库信息,可以发现id为2的书籍,作者对象的id都是大于2的,即id为2和3的作者


30e84900f35744f0af48d906224da619.png

  • 传入对象id的方式
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    book_obj = models.Book.objects.get(id=2)
    #author_list = models.Author.objects.filter(id__gt=2)
    book_obj.authors.add(*[1,3])  #将id为1和3的作者添加到这本书作者的集合中
    return HttpResponse("ok")
  • 访问测试



e3fc77791c404db0841f5a8624e5a3c7.png


  • 查看数据库信息,可以发现id为2的书籍,3个作者都已经添加到了集合中

36127b656b9d4a45a7c2b74726527a15.png


  • 下面是反向,反向应该是小写表面_set
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    ying = models.Author.objects.filter(name="任盈盈").first()
    book = models.Book.objects.filter(title="Python教程").first()
    ying.book_set.add(book)
    return HttpResponse("ok")
  • 访问测试



bd2cf0ef37e647acaa7f1350aa22c221.png

查看数据库信息,可以看到Python教程(id=1)数据的作者添加了任盈盈(id=3)


1715a4b6a59245cfa0103e3cdbf344a5.png


2、create()


  • 创建一个新的对象,并且同时将它添加到关联对象集之中,返回新创建的对象


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    pub = models.Publish.objects.filter(name="明教出版社").first()
    wo = models.Author.objects.filter(name="任我行").first()
    book = wo.book_set.create(title="ORM教程",price=150,pub_date="2012-10-10",publish=pub)
    print(book,type(book))
    return HttpResponse("ok")


  • 访问测试

9c753254e02d4652a1e113d31115f47c.png

  • 查看数据库信息


e51d3cdcb2044a319c2ae22826b50f60.png

74157b8ac59f4edcbc9cc4e700192b28.png

3、remove()


  • 从关联对象集中移除执行的对象,对于ForeignKey对象,这个方法尽在null=True即可以为空时存在,没有返回值
  • 先来看一下数据库信息,确定好要删除的行


3a2de6cee7c94f068e1b49830e4bfd8e.png


  • 例如要删除书籍2和作者2的行
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    author_obj = models.Author.objects.get(id=2)
    book_obj = models.Book.objects.get(id=2)
    author_obj.book_set.remove(book_obj)
    return HttpResponse("ok")
  • 访问测试


9d1d248ca8974b66a9496468c8b4346c.png


查看数据库信息,可以看到已经删除


47dcf311e378415e8f0107908efeca82.png


4、clear()


  • 从关联对象集合中移除所有对象,删除关联,不会删除对象。对于ForeignKey对象,这个方法仅在null=True即可以为空时存在,没有返回值
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    book = models.Book.objects.filter(title="Django教程").first()   
    book.authors.clear()    #删除django教程的所有关联
    return HttpResponse("ok")

访问测试


6eb894b5e5664f6e886d881aa0efa9b8.png

查看数据库信息,可以看到Book表中的Django教程行还是存在的,但是关联表book_authors中的Django教程(id=2)的行已经被删除


76da17949a464088987e4a69b97ecd98.png


ee1fdd3e2c19423c8a49a41849e3120f.png



四、ORM查询


  • 基于对象的跨表查询
  • 语法:


正向:属性名称

反向:小写类名_set


1、一对多


  • 查询主键为3的书籍出版社所在的城市,即正向查询
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    book = models.Book.objects.filter(pk=3).first()
    res = book.publish.city
    print(res,type(res))
    return HttpResponse("ok")

访问测试


cef8f229fcf5411eb777f45b67b85730.png查看终端输出和数据库信息,可以看到是相同的


37c9503f3d7d40068e232c19ee75bf04.png

cc287f5fd99f416882be1643c0979b0b.png


8bfac998aa90454c8d16f94de3246a43.png


查询华山出版社出版的书籍名称,即反向

反向的写法:对象.小写类名_set(pub.book_set)可以跳转到关联的表,即书籍表

pub.book_set.all():取出书籍表中的所有书籍对象,在一个QuerySet对象中,遍历取出书籍对象


# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    pub = models.Publish.objects.filter(name="华山出版社").first()
    res = pub.book_set.all()
    for i in res:
        print(i.title)
    return HttpResponse("ok")

访问测试


ff20c7c703cb4abcab6cb150036f1fc6.png

查看终端输出和数据库信息


63cfee9564f44391993b91bed7d4322f.png

99f718be1cf441ec93e88295a702c5e8.png

6cea081a1c104224b7fc8bd6bd61ec65.png


2、一对一


  • 正向:对象.属性(author.au_detail)可以跳转到关联的表
  • 下面查询令狐冲的电话
# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    author = models.Author.objects.filter(name="令狐冲").first()
    res = author.au_detail.tel
    print(res,type(res))
    return HttpResponse("ok")
  • 访问测试


fe83296c81c54214898ae2020cd4cdba.png

  • 查看终端输出和数据库信息


50c88a0350124846a40a1da9f70917a5.png

fc121e07d0e444759c162e7d67a62059.png


c85f7f29469e4ee8a13174ebb67f5b76.png


查询到所有住址在黑木崖的作者姓名,即反向,一对一的反向,使用对象.小写类名即可,不用加_set


反向:对象.小写类名(addr.author)可以跳转到关联的表

# -*- coding: utf-8 -*-
from django.shortcuts import render,HttpResponse
from app1_model import models
def add_book(request):
    #books = models.Book.objects.create(title="Python",price=500,publish="Python出版社",pub_date="1970-12-10")  
    addr = models.AuthorDetail.objects.filter(addr="黑木崖").first()  
    res = addr.author.name
    print(res,type(res))
    return HttpResponse("ok")

访问测试


495935160f6140bdbf619a65ad596030.png


查看终端输出和数据库信息,由于上面查询时使用了first()方法,所以只输出了一个作者名称


f23935583a8347d49d81989c7a6503e9.png


10d41009cdd44f7686ebe811ef29e749.png1e2142d4fc804315afcb608b9f572889.png

目录
相关文章
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
61 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
SQL Go 数据库
【速存】深入理解Django ORM:编写高效的数据库查询
【速存】深入理解Django ORM:编写高效的数据库查询
58 0
|
3月前
|
数据管理 数据挖掘 调度
Django后端架构开发:URLconf到ORM深度剖析
Django后端架构开发:URLconf到ORM深度剖析
55 1
|
3月前
|
数据库 Python
Django ORM
【8月更文挑战第23天】
43 4
|
3月前
|
API 数据库 开发者
【独家揭秘】Django ORM高手秘籍:如何玩转数据模型与数据库交互的艺术?
【8月更文挑战第31天】本文通过具体示例详细介绍了Django ORM的使用方法,包括数据模型设计与数据库操作的最佳实践。从创建应用和定义模型开始,逐步演示了查询、创建、更新和删除数据的全过程,并展示了关联查询与过滤的技巧,帮助开发者更高效地利用Django ORM构建和维护Web应用。通过这些基础概念和实践技巧,读者可以更好地掌握Django ORM,提升开发效率。
41 0
|
3月前
|
SQL Go 数据库
Django入门到放弃之ORM多表操作
Django入门到放弃之ORM多表操作
|
3月前
|
SQL 关系型数据库 MySQL
Django入门到放弃之ORM单表操作
Django入门到放弃之ORM单表操作
|
4月前
|
SQL 数据库 Python
Django框架数据库ORM查询操作(6)
【7月更文挑战第6天】```markdown Django ORM常用数据库操作:1) 查询所有数据2) 根据ID查询 3) 精确查询 4) 分页排序
74 1
|
5月前
|
JSON 缓存 数据库
Django ORM的QuerySet:解锁数据库交互的魔法钥匙
Django ORM的QuerySet:解锁数据库交互的魔法钥匙
|
5月前
|
存储 安全 数据库
Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践
Django ORM深度游:探索多对一、一对一与多对多数据关系的奥秘与实践