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

目录
相关文章
|
3天前
|
Oracle 关系型数据库 MySQL
Django框架ORM操作(二)
Django框架ORM操作(二)
|
3天前
|
SQL 存储 前端开发
Django框架ORM操作(一)
Django框架ORM操作(一)
Django框架ORM操作(一)
|
7天前
|
SQL 缓存 数据库
在Python Web开发过程中:数据库与缓存,如何使用ORM(例如Django ORM)执行查询并优化查询性能?
在Python Web开发中,使用ORM如Django ORM能简化数据库操作。为了优化查询性能,可以:选择合适索引,避免N+1查询(利用`select_related`和`prefetch_related`),批量读取数据(`iterator()`),使用缓存,分页查询,适时使用原生SQL,优化数据库配置,定期优化数据库并监控性能。这些策略能提升响应速度和用户体验。
9 0
|
5月前
|
SQL 数据库 开发者
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
Python Web 开发: 什么是 Django ORM?如何使用它进行数据库操作?
|
16天前
|
SQL 缓存 数据库
Django ORM的性能优化:高效处理大量数据
【4月更文挑战第15天】本文介绍了优化Django ORM性能的六大技巧:1) 使用批量操作如bulk_create和bulk_update;2) 利用prefetch_related和select_related减少查询次数;3) 为常用字段添加索引;4) 优化数据库查询,避免循环查询;5) 使用缓存提升频繁查询性能;6) 在必要时使用原生SQL。这些策略能帮助处理大量数据时提升Django ORM的效率。
|
16天前
|
SQL 自然语言处理 数据库连接
Django ORM的魔力:简化数据库操作与迁移
【4月更文挑战第15天】Django ORM是Django框架的关键部分,提供了一种高级的面向对象方式与数据库交互,简化了手动SQL操作。通过定义Python数据模型,开发者能轻松创建数据库表结构,使用ORM执行查询、添加、修改和删除数据。Django ORM还自动化处理数据库连接、事务和数据类型转换。当模型变化时,Django的迁移工具帮助管理数据库结构的更新。通过这种方式,Django ORM促进了高效、专注于业务逻辑的Web开发。
|
17天前
|
SQL API 数据库
python的Django ORM框架深度解析
【4月更文挑战第14天】在Python的Web开发领域,Django无疑是一个备受推崇的框架。它提供了许多强大的工具和功能,使得开发者能够高效、快速地构建出高质量的Web应用。而在Django的众多特性中,ORM(对象关系映射)框架更是其不可或缺的一部分。本文将详细解析Django ORM框架,帮助读者更好地理解和使用它。
|
2月前
|
SQL API 数据库
一篇文章带你了解Django ORM操作
一篇文章带你了解Django ORM操作
20 0
|
2月前
|
数据采集 存储 数据处理
Python爬虫在Django项目中的数据处理与展示实例
Python爬虫在Django项目中的数据处理与展示实例
|
5月前
|
算法 Docker Python
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
Python【算法中心 03】Docker部署Django搭建的Python应用流程实例(Docker离线安装配置+Django项目Docker部署)
61 0