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

目录
相关文章
|
7月前
|
存储 关系型数据库 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移1
Django创建应用、ORM的进阶使用及模型类数据库迁移1
74 0
|
6月前
|
SQL 关系型数据库 MySQL
Django入门ORM(Django操作MySQL) 专题一
Django入门ORM(Django操作MySQL) 专题一
|
7月前
|
存储 数据可视化 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移3
Django创建应用、ORM的进阶使用及模型类数据库迁移3
52 0
|
7月前
|
关系型数据库 MySQL 数据库
Django创建应用、ORM的进阶使用及模型类数据库迁移2
Django创建应用、ORM的进阶使用及模型类数据库迁移2
46 0
|
4月前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
|
1月前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
18 0
|
1月前
|
数据采集 存储 数据处理
Python爬虫在Django项目中的数据处理与展示实例
Python爬虫在Django项目中的数据处理与展示实例
|
5月前
|
SQL 关系型数据库 MySQL
07 Django模型 - ORM简介及MySQL数据库的使用
07 Django模型 - ORM简介及MySQL数据库的使用
35 0
|
4月前
|
算法 Docker Python
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
59 0
|
4月前
|
算法 Java Python
Python【算法中心 01】Web框架Django入门(安装+项目创建+应用创建+服务启动)Python搭建算法中心后台实例分享
Python【算法中心 01】Web框架Django入门(安装+项目创建+应用创建+服务启动)Python搭建算法中心后台实例分享
47 0