一对多

  • 一个出版社多本书
  • 一本书一个出版社

在数据库中的体现

  • 通过外键(Foreign Key)来体现一对多
  • 在(多)的表中增加对(一)的外键

语法

  • 使用外键(Foreign Key)在(多)的实体中增加

    • 属性的=models.ForeignKey(Entry)

给图书增加出版社外键实战案例源码

# 图书 Book:title publicate_date
class Book(models.Model): title = models.CharField(max_length=32, verbose_name='书名') publicate_date = models.DateField(auto_now=True, verbose_name='出版日期') # 增加对出版社的引用 publisher = models.ForeignKey('Publisher', null=True) def __str__(self): return self.title class Meta: verbose_name_plural = '图书' ordering = ['-publicate_date', 'title'] 
Python
Copy

查询

  • 正向查询 通过Book查询Publisher

    • 案例:查询id为1的书籍的信息
    • book=Book.objects.get(id=1)
    • publisher=book.publisher

正向查询实战案例源码

# 查询图书
def book(request): book = Book.objects.get(id=1) publisher = book.publisher.name # books=Book.objects.all() return render(request, 'book.html', { # 'books':books 'book': book, 'publisher': publisher }) 
Python
Copy

  • 反向查询 通过Publisher查询Book

    • Django会在(一)的实体中增加(多)的隐藏属性
    • 关联对象小写_set
    • 用于查询多的数据
    • 注意,查询的时候,必须要在管理属性后面加参数
    • all()或其他

反向查询实战案例源码

# 查询图书
def book(request): book = Book.objects.get(id=1) publisher = book.publisher.name #查询id为3的出版社的所有书籍 publisher1=Publisher.objects.get(id=1) books=publisher1.book_set.all() print(books) # books=Book.objects.all() return render(request, 'book.html', { # 'books':books 'book': book, 'books': books, 'publisher': publisher, 'publisher1': publisher1.name }) 
Python
Copy

多对多关联

  • 什么是多对多

    • A表中的一条记录可以对应B表中的多条记录
    • B表中的一条记录也可以对应A表中的多条记录
  • 案例
    • 作者和书籍
    • 商品和买家
  • 在数据库中的体现
    • 必须创建第三张表,关联涉及到的两张表的数据
  • 语法
    • 允许在任何一个实体中增加操作
    • entry=models.ManyToManyField(Entry)

回忆

  • Django数据库恢复备份状态的指令
  • python manage.py migrate index(应用名) 0001(状态id)

指定后台分组的实战源码

class PulisherAdmin(admin.ModelAdmin): # fields = ('name', 'city') fieldsets = ( ('分组1', {'fields': ('name', 'city'), 'classes': ('collapse',)}), ('分组2', {'fields': ('country', 'website')})) list_display = ['name', 'city', 'country', 'website'] 
Python
Copy

多对多查询

  • 正向查询

    • 通过作者(Author)表查询书籍(Book)表
    • author=Author.objects.get(id=1)
    • books=author.book.all() 通过关联属性.all()查询所有的数据

正向查询实战案例源码

# 多对多查询
def mtm(request): author = Author.objects.get(id=3) books = author.book.all() return render(request, 'mtm.html', { 'books': books, }) 
Python
Copy

  • 反向查询

    • 通过书籍(Book)表查询作者(Author)表
    • book=Book.objects.get(id=1)
    • authors=book.author_set.all()

反向查询实战案例元am

# 多对多查询
def mtm(request): author = Author.objects.get(id=3) books = author.book.all() # 反向查询 book = Book.objects.get(id=3) authors = book.author_set.all() return render(request, 'mtm.html', { 'books': books, 'author':author, 'authors': authors, }) 
Python
Copy

练习

  • 创建Author和Publisher的多对多关系
  • 查询李白所签约的所有出版社
  • 查询北京大学出版社下的所有作者

实战案例源码

# 出版社与作者多对多查询
def publisher2author(request): publisher = Publisher.objects.filter(name__exact='北京大学出版社').first() authors = publisher.author.all() return render(request, 'publisher2author.html', { 'authors': authors, }) 
Python
Copy

自定义查询对象 objects

  • 声明类EntryManager,继承自models.Manager
class EntryManager(models.Manager):def 函数名(self,自定义参数列表)
  • 使用EntryManager覆盖models类中的objects
class Entry(models.Model):objects=EntryManaer()

实战案例源码

# 声明自定义objects - models.Manager
class AuthorManager(models.Manager): # 添加自定义函数-查询Author表中共有多少条数据 def auCount(self): return self.all().count('*') # count方法统计多少个 # 作者 Author:name age email class Author(models.Model): # 使用AuthorManager覆盖当前的objects objects = AuthorManager() name = models.CharField(max_length=32, verbose_name='姓名') age = models.PositiveSmallIntegerField(verbose_name='年龄') email = models.EmailField(null=True, verbose_name='邮箱') # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) wife = models.OneToOneField('Wife', null=True, verbose_name='妻子') # 创建与书籍的多对多关联 book = models.ManyToManyField('Book') def __str__(self): return self.name class Meta: verbose_name_plural = '作者' # 排序 年龄降序 id升序 ordering = ['-age', 'id'] # 在view控制器中调用 # 出版社与作者多对多查询 def publisher2author(request): publisher = Publisher.objects.filter(name__exact='北京大学出版社').first() authors = publisher.author.all() print('数据总数:', Author.objects.auCount()) return render(request, 'publisher2author.html', { 'authors': authors, }) 
Python
Copy

练习

  • 为Author指定自定义objects对象

    • 查询年纪小于指定年纪的作者的信息
  • 为Book指定自定义的objects对象
    • 查询书名中包含指定关键字的信息

查询书籍实战源码

# 声明自定义的objects - Book表
class BookManager(models.Manager): def like(self, s): return self.filter(title__contains=s) 
Python
Copy

# 图书 Book:title publicate_date
class Book(models.Model): objects = BookManager() title = models.CharField(max_length=32, verbose_name='书名') publicate_date = models.DateField(auto_now=True, verbose_name='出版日期') # 增加对出版社的引用 publisher = models.ForeignKey('Publisher', null=True, verbose_name='出版社') def __str__(self): return self.title class Meta: verbose_name_plural = '图书' ordering = ['-publicate_date', 'title'] 
Python
Copy

# 出版社与作者多对多查询
def publisher2author(request): publisher = Publisher.objects.filter(name__exact='北京大学出版社').first() authors = publisher.author.all() # AuthorManager测试 print('数据总数:', Author.objects.auCount()) # BookManager测试 print('查询包含字段的书籍:', Book.objects.like('三')) return render(request, 'publisher2author.html', { 'authors': authors, }) 
Python
Copy

年纪查询实战案例源码

# 声明自定义objects - models.Manager
class AuthorManager(models.Manager): # 添加自定义函数-查询Author表中共有多少条数据 def auCount(self): return self.all().count() # count方法统计多少个 # 查询年纪小于指定年纪的作者信息 def ltAge(self, i): return self.filter(age__lt=i) 
Python
Copy

# 作者 Author:name age email
class Author(models.Model): # 使用AuthorManager覆盖当前的objects objects = AuthorManager() name = models.CharField(max_length=32, verbose_name='姓名') age = models.PositiveSmallIntegerField(verbose_name='年龄') email = models.EmailField(null=True, verbose_name='邮箱') # 增加一个状态列,来表示用户是启用的还是禁用的 isActive = models.BooleanField(default=True) wife = models.OneToOneField('Wife', null=True, verbose_name='妻子') # 创建与书籍的多对多关联 book = models.ManyToManyField('Book') def __str__(self): return self.name class Meta: verbose_name_plural = '作者' # 排序 年龄降序 id升序 ordering = ['-age', 'id'] 
Python
Copy

# 出版社与作者多对多查询
def publisher2author(request): publisher = Publisher.objects.filter(name__exact='北京大学出版社').first() authors = publisher.author.all() # AuthorManager测试 print('数据总数:', Author.objects.auCount()) print('查询年纪小于指定信息的作者:', Author.objects.ltAge(100)) # BookManager测试 print('查询包含字段的书籍:', Book.objects.like('三')) return render(request, 'publisher2author.html', { 'authors': authors, })

转载于:https://www.cnblogs.com/gao_x/p/10509399.html

Django笔记(六)相关推荐

  1. Django笔记六之外键ForeignKey介绍

    这一篇笔记介绍 Django 系统 model 的外键处理,ForeignKey 以及相应的处理方法. 这是一种一对多的字段类型,表示两张表之间的关联关系. 本篇笔记的目录如下: on_delete ...

  2. python 3.5 django 笔记(六)修改博客标题与内容

    接下来,要把博客继续完善 画个画儿先~~ ~~~~~~ ~~~~~~ 主页点击修改文章----修改文章页面 主页点击新文章----新文章页面 新文章提交后----主页 修改文章提交后----修改文章 ...

  3. Django笔记总结

    1.web框架的本质 web通信流程 web我们这里指的就是通过浏览器去访问服务端,请求页面或者数据的通信方式,属于B/S架构.就是我们常见的网站.浏览器与服务端的通信流程:浏览器客户端发送一个请求信 ...

  4. Ethernet/IP 学习笔记六

    Ethernet/IP 学习笔记六 EtherNet/IP defines two primary types of communications: explicit and implicit (Ta ...

  5. Django 笔记6 -- 多表查询

    Django 笔记6 – 多表查询 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Djang ...

  6. Django 笔记5 -- 数据库

    Django 笔记5 – 数据库 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django ...

  7. Django 笔记4 -- 模板

    Django 笔记4 – 模板 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django官 ...

  8. Django 笔记3 -- URL

    Django 笔记3 – URL Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Django ...

  9. Django 笔记2 -- Django 项目

    Django 笔记2 – Django 入门 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: ...

  10. Django 笔记1 -- 环境搭建

    Django 笔记1 – 环境搭建 Django 系列笔记是笔者学习.实践使用 Django 的相关笔记,大量参考了知了课堂的<Django零基础到项目实战>教程. 参考文档: Djang ...

最新文章

  1. 加州伯克利大学:自动驾驶中虚拟到现实的强化学习|厚势汽车
  2. 关于Oracle中in,exists 与 not in, not exists
  3. 缓冲多少数据_聊点深的:解析MySQL,看看InnoDB 缓冲池(buffer pool) 工作原理
  4. virt-v2v 使用指南
  5. IntelliJ IDEA内存优化最佳实践(转)
  6. linux系统操作大全,Linux系统的常用操作命令大全
  7. 利用Mac创建一个 IPv6 WIFI 热点
  8. SQL ORDER BY Clause
  9. 先出报表还是先计提所得税_合并报表投资时点的评估增值和内部交易到底该如何理解????...
  10. Python基础教程,Python入门教程(非常详细)
  11. C语言字符与数字的互转
  12. [高通SDM450][Android9.0]CTA认证--蓝牙、WIFI申请权限
  13. 大数据的产业链分析,大数据完整的产业链构成
  14. 企业大楼AI无感考勤解决方案
  15. Python---Excel文件xls格式转为xlsx格式
  16. git版本控制常用指令
  17. 代码阅读工具学习总结
  18. 编程的首要原则是什么?
  19. 有啊百度知道双色球红蓝走势图
  20. 网页前台推荐一款配色软件:Adobe kuler(在线升级,ADOBE官方产品)

热门文章

  1. java EE开发之Servlet第八课:MVC模式 (基本理解)
  2. 学习存储原理——地址线,存储字长,存储字
  3. acme.sh从 letsencrypt 生成SSL免费证书并自动更新证书
  4. 金属制品行业B2B交易管理系统:充分整合行业资源,助力企业开拓市场营销渠道
  5. 互联网思维的六大特性
  6. 算法训练 删除多余括号
  7. 跨模态语义关联对齐检索-图像文本匹配(Image-Text Matching)CVPR2022
  8. 数据库应用系统功能设计与实施
  9. php将图片转化成文字,什么软件可以将图片转换成文字,图片转换成文字的方法...
  10. 基于ssm美食推荐管理系统获取(java毕业设计)