ORM多表操作 之 基于对象的跨表查询

目录

1.基于对象的跨表查询:

2.模型介绍

3.模型建立

4.添加数据

5.实例演示

一对多

 多对多

一对一


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

猜你喜欢

转载自blog.csdn.net/m0_38109046/article/details/87966136