目录
1.基于对象的跨表查询:
基于对象的跨表查询也就是SQL中的子查询。
2.模型介绍
定义模型:
作者:nid、name、age
作者详细:nid、birthday、telephone、addr
出版社:nid、name、city、email
书籍:nid、title、publishDate、price
模型之间的关系:
1.作者和作者详细是一对一的关系
2.作者和书籍是多对多的关系
3.书籍和出版社是多对一的关系
3.模型建立
建立模型语句:
from django.db import models # Create your models here. class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField( max_length=32) age=models.IntegerField() # 与AuthorDetail建立一对一的关系 authorDetail=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) class AuthorDetail(models.Model): nid = models.AutoField(primary_key=True) birthday=models.DateField() telephone=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() class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField( max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2) # 与Publish建立一对多的关系,外键字段建立在多的一方 publish=models.ForeignKey(to="Publish",to_field="nid",on_delete=models.CASCADE) # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表 authors=models.ManyToManyField(to='Author',)
4.添加数据
author表:
authorDetail表:
book表:
publish表:
5.实例演示
正向查询是指:A,B两个表的关联字段在A表中,由A查B是正向。
反向查询是指:A,B两个表的关联字段在A表中,由B查A是反向。
一对多
# 正向查询按字段:按照关联字段
#反向查询:按“表名(小写)_set.all()”
# 一对多 book(关联字段在Book表里) --> publish
# 正向:book->publish 反向:publish->book
# 正:按字段(publish)
# 一对多:book ---------------------->publish
# <---------------------
# 反:book_set.all()
# 正向查询按字段:按照关联字段
# 查询“python”书籍的出版社的地址
ret = models.Book.objects.filter(title="python").publish.city
print(ret)
打印:AttributeError: 'QuerySet' object has no attribute 'publish'
# 注意:models.Book.objects.filter(title="python")它是一个QuerySet对象,没有‘publish’属性。
#tpye:<class 'django.db.models.query.QuerySet'>
ret = models.Book.objects.filter(title="python").first().publish.city
print(ret)
打印:北京
# first()返回的是具体的对象,type:<class 'app01.models.Book'>
# 反向查询:按“表名(小写)_set.all()”
# 查询苹果出版社 出版的书籍名称
pub_obj = models.Publish.objects.filter(name="苹果出版社").first()
for book in pub_obj.book_set.all():
print(book.title)
打印: python
java
多对多
# 正向查询按字段:按照关联字段.all()
#反向查询:按“表名(小写)_set.all()”
# 按字段: authors.all()
# 多对多 book----------------------->author
# <----------------------
# book_set.all()
# 正向:查询python作者年龄
book_obj = models.Book.objects.filter(title="python").first() # 书本对象
for auth in book_obj.authors.all():
print(auth.name, auth.age)
打印:zhou 23
zang 24
# 反向:查询"zhou"出版过的书籍名称
auth_obj = models.Author.objects.filter(name="zhou").first()
for book in auth_obj.book_set.all():
print(book.title)
打印: python
java
一对一
# 正向查询按字段
#反向查询按表名
# 按字段: authorDetail
# 一对一 author----------------------->authorDetail
# <-----------------------
# 按表名:author
# 正向:查询“zhou”的手机号
auth_obj = models.Author.objects.filter(name="zhou").first()
print(auth_obj.authorDetail.telephone)
打印:15012345678
# 反向:查询家在"英国伦敦"的作者姓名
ad_obj = models.AuthorDetail.objects.filter(addr="英国伦敦").first()
print(ad_obj.author.name)
打印:zang