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. deep_learning_Function_matpotlib_scatter()函数

    plt.scatter()函数用于生成一个scatter散点图. matplotlib.pyplot.scatter(x, y, s=20, c='b', marker='o', cmap=None, ...

  2. Runtime.getRuntime.exec()执行linux脚本导致程序卡死问题

    rumtime程序执行中出现卡住,执行成果达不到预期的标准.查看输出流以及错误流程是否内存占满了.开两个线程来运行输出流程和错误流程. rumtime运行windows脚本执行是要添加执行环境 cmd ...

  3. constant read 和 current read

    来自网络,并且在本机实验完成: onsistent read :我的理解,就是通过scn来读取.  读取的过程中要保证 scn是一致的.举个例子,一个SELECT 语句在SCN=100的时刻开始读取一 ...

  4. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  5. thinkPHP5.0.22初体验---request相关用法

    如果浏览器要返回美观排列的json数据,可以安装火狐浏览器的插件 返回XML的数据格式 渲染模板的用法 return $this->fetch('index/index2')效果 扒掉stirp ...

  6. 【51nod1792】Jabby's segment tree

    题目 线段树是一种经典的数据结构,一颗[1,n]的线段树他的根是[1,n],当一个线段树的结点是[l,r]时,设mid=(l+r)>>1,则这个结点的左儿子右儿子分别是[l,mid],[m ...

  7. JVM启动参数大全及默认值

    Java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现都满足, ...

  8. 学到了林海峰,武沛齐讲的Day51 django+数据库

    连不上,通过这一步解决 搞死了..辛苦但觉得值得 刷数据库 出问题 IDEA关联MySQL报错:Server returns invalid timezone. Go to ‘Advanced’ ta ...

  9. Mybatis中通过父类/接口来限定类的别名(TypeAlias)配置

  10. oracle(转)

    Oracle数据库基本操作 1.概述 Oracle数据库客户端一般需要安装在服务器上,可以在服务器端操作,一般我们可以用sql developer工具远程连接到数据库,先行建立数据库,然后对表进行增删 ...