model.py

from django.db import models

# Create your models here.

class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=64)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2) publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE) authors = models.ManyToManyField(to="Author") class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
# 作者和作者信息一对一
AuthorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
# birthday = models.DateField() 如果报错 Python int too large to convert to C long 则注销这行
tetephone = models.BigIntegerField()
addr = models.CharField(max_length=64) class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()

views.py

from django.shortcuts import render

# Create your views here.
from django.shortcuts import HttpResponse, redirect, render
from .models import Book, Author, AuthorDetail, Publish def index(request): ''' 一(出版社)对多(书籍) 查询 ''' # 1、(正向查询按字段) 查询主键为1的书籍的出版社所在的城市
book_obj=Book.objects.get(pk=1)
print(book_obj.publish.city) # 2、(反向查询)查询 苹果出版社 出版的所有书籍的名字(反向查询按表名小写)
# “要查询的表_set” 就是反向查询所要查询的关联表数据
publish_obj=Publish.objects.get(name="苹果出版社")
print(publish_obj.city)
book_list=publish_obj.book_set.all()
print(book_list)
for item in book_list:
print(item.title) ''' 一(作者)对一(作者详情)查询 '''
# 1、反向查询 查询所有住址在北京的作者的姓名(通过authordetail去查询author表)
author_detail_list=AuthorDetail.objects.filter(addr="北京").all()
print(author_detail_list)
for item in author_detail_list:
print(item.author.name) # 2、正向查询 查询作者为tom的地址在哪里?
author_obj=Author.objects.get(name="tom")
print(author_obj) # Author object (1)
print(author_obj.AuthorDetail) # AuthorDetail object (1)
print(author_obj.AuthorDetail.addr) # 北京 '''多(Author)对多(Book)查询'''
# 正向查询
# 1、追风筝的人 所有作者的名字以及手机号
book_obj=Book.objects.get(title="追风筝的人")
print(book_obj) # Book object (3)
author_list=book_obj.authors.all()
print(author_list) # <QuerySet [<Author: Author object (1)>, <Author: Author object (2)>]>
for author_obj in author_list:
print(author_obj) # Author object
print(author_obj.name)
print(author_obj.AuthorDetail.addr) # 再跨一张authordetail表 # 2、反向查询 查询tom出过的所有书籍的名字
author_obj=Author.objects.get(name="tom")
print(author_obj) # Author object (1)
book_list=author_obj.book_set.all()
print(book_list) # <QuerySet [<Book: Book object (3)>, <Book: Book object (1)>]>
for book_obj in book_list:
print(book_obj.title) return HttpResponse("ok")

基于对象的orm跨表查询再练习的更多相关文章

  1. 第十七篇 ORM跨表查询和分组查询---二次剖析

    ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...

  2. 六、Django学习之基于下划线的跨表查询

    六.Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码.反向查询例子反之. 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 resul ...

  3. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  4. ORM跨表查询总结

    一.基于对象的查询-->子查询 1.一对多 正向查询:基于 字段 反向查询:基于 表名__set.all() 注意:表名全部小写 2.多对多 正向查询:基于 字段.all() 反向查询:基于 表 ...

  5. ORM跨表查询问题

    环境准备: 表结构 from django.db import models # Create your models here. class Publisher(models.Model): id ...

  6. django orm跨表查询废话最少最精简版

    在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...

  7. $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)

    自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...

  8. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  9. django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)

    models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True),  OneToOneField("Author" ...

随机推荐

  1. 13、yum

    1.yum yum是管理rpm包的工具 2.yum源(yum仓库) 要使用yum前,需要准备一个yum源(我们也称为yum仓库), 这个可以是一个互联网上的仓库,也可以是本地自己搭建的仓库. 仓库里面 ...

  2. 第二篇.1、python基础之数据类型与变量

    一.变量 1 什么是变量之声明变量 #变量名=变量值 age=18 gender1='male' gender2='female' 2 为什么要有变量 变量作用:“变”=>变化,“量”=> ...

  3. QT 托盘 hover事件捕捉

    1. QSystemTrayIcon hover事件 参考:https://stackoverflow.com/questions/21795919/how-to-catch-the-mousehov ...

  4. deep_learning_Function_numpy.linspace()

    numpy.linspace()等差数列函数 在numpy中的linspace()函数类似与arange().range()函数: arange() .range() 可以通过指定开始值.终值和步长创 ...

  5. 查看jar包依赖树

    在eclipse执行如下命令: 可以在控制台上查看层级依赖关系

  6. PXE自动化部署

    PXE 预启动执行环境,基于tftp条件下完成基于网络的自动化部署软件 原理: 网卡利用自身的tftp 请求dhcp 服务器获取ip和一个pxelinux.0的地址 在给定的tftp目录下存有ks的配 ...

  7. 北美CS求学找工指南

    这篇文章主要谈谈来美求学工作这一路的点点滴滴,因为之前留言中不少同学对这方面内容比较感兴趣,有些已经在准备,有些还在犹豫,希望本文能对大家有些许帮助.因为来美的途径也有不少,有上学.有投资.有通过国内 ...

  8. 第二章 Vue快速入门-- 24 过滤器-Vue中全局过滤器的基本使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  9. VMware中的桥接模式--来自网络

    在桥接模式下,VMware虚拟出来的操作系统就像是局域网中的一独立的主机,它可以访问网内任何一台机器.不过你需要多于一个的IP地址,并且需要手工为虚拟系统配置IP地址.子网掩码,而且还要和宿主机器处于 ...

  10. 小米手机安装https证书报错:无法安装该证书 因为无法读取该证书文件

    Fiddler]手机安装https证书报错:无法安装该证书 因为无法读取该证书文件   之前在手机上使用 “ip:端口号” 的方法就能直接在手机上自动下载安装fiddler证书,但是现在有些手机并不能 ...