基于对象的orm跨表查询再练习
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跨表查询再练习的更多相关文章
- 第十七篇 ORM跨表查询和分组查询---二次剖析
ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...
- 六、Django学习之基于下划线的跨表查询
六.Django学习之基于下划线的跨表查询 一对一 正向查询的例子为 已知用户名,查询用户的电话号码.反向查询例子反之. 正向查询 其中下划线前的表示表名,无下划线的表示的是Author表 resul ...
- Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询
一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增 create publish_id 传数字 (publish_id是数据库显示的字段名 ...
- ORM跨表查询总结
一.基于对象的查询-->子查询 1.一对多 正向查询:基于 字段 反向查询:基于 表名__set.all() 注意:表名全部小写 2.多对多 正向查询:基于 字段.all() 反向查询:基于 表 ...
- ORM跨表查询问题
环境准备: 表结构 from django.db import models # Create your models here. class Publisher(models.Model): id ...
- django orm跨表查询废话最少最精简版
在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...
- $Django 多对多-自定义第三张表 基于双下划线的跨表查询(补充)
自定义第三张表的好处:可以定义多个字段, 缺点:查询不方便(有方法解决) 1.第三张表设置外键,联合唯一(查询不方便) class Books(models.Model): name=models.C ...
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- django之 使用views.py里面的函数对表进行增删改查 内容(models.py中表的创建、views.py中函数的使用,基于对象的跨表查询)
models之对于表的创建有以下几种: 一对一:ForeignKey("Author",unique=True), OneToOneField("Author" ...
随机推荐
- U-boot新手入门,烧写进mini2440
拿到一块开发板,首先就要找到它的资料,当然了,开发板的厂商或者代理商会提供资料,资料里会有你需要的. 比如我的这块mini2440,在友善之臂代理商提供的资料里面,就有我们这篇所需要的 把这个文件夹下 ...
- python-1.Centos7安装Python3.6和Scrapy的方法
由于centos7原本就安装了Python2,而且这个Python2不能被删除,因为有很多系统命令,比如yum都要用到 [root@iZm5efjrz9szlsq1a0ai3gZ ~]# python ...
- Lomsat gelral CodeForces - 600E (树上启发式合并)
You are given a rooted tree with root in vertex 1. Each vertex is coloured in some colour. Let's cal ...
- [CF#592 E] [二分答案] Minimizing Difference
链接:http://codeforces.com/contest/1244/problem/E 题意: 给定包含$n$个数的数组,你可以执行最多k次操作,使得数组的一个数加1或者减1. 问合理的操作, ...
- jvm中的新生代Eden和survivor区
1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分代完全可以,分代的唯一理由就是优化GC性能.你先想想,如果没有分代,那我们所有的对象都在一块,GC的时候我 ...
- k8sConfigMap资源
ConfigMap对象用于为容器中的应用提供配置数据以定制程序的行为,不过敏感的配置信息,例如密钥.证书等通常由Secret对象来进行配置.他们将相应的配置信息保存于对象中,而后在pod资源上以存储卷 ...
- beautifulsoup4 用法一二
声明一个beautifulsoup4对象 bs = ( url,//路由 html_parser,//解析html代码 encoding//编码)//另一种请求解析方法 import requests ...
- ELEMENT-UI 封装el-table 局部刷新row
//关于封装的el-table行数据更新后如何局部更新row row.status=status; this.$set(this.$refs.elTable.$data.tableData,index ...
- maven项目创建5 service层整合
创建service相关文件 创建applicationContext-service.xml文件 <?xml version="1.0" encoding="UTF ...
- C/C++预处理指令#define,条件编译#ifdefine
本文主要记录了C/C++预处理指令,常见的预处理指令如下: #空指令,无任何效果 #include包含一个源代码文件 #define定义宏 #undef取消已定义的宏 #if如果给定条件为真,则编译下 ...