跨表查询
一、ORM 跨表查询
class Book(models.Model):
title = models.CharField(max_length=32)
publish = models.ForeignKey(to="Publish",to_field="id",on_delete=models.CASCADE)
authors = models.ManyToManyField(to = "Author",related_name='bookList')
class Publish(models.Model):
name = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
ad = models.OneToOneField("AuthorDetail",on_delete=models.CASCADE)
class AuthorDetail(models.Model):
telephone = models.BigIntegerField()
1、基于对象查询(sql:子查询):
一对多、(Publish--Book)
正向查询,按字段:
查询python这本书的出版社所在名称
book_obj = Book.objects.filter(title="python").first()
print(book_obj.publish.name)
反向查询,按表明小写_set:
人民出版社出版过的所有书籍名称
publish_obj = Publish.objects.filter(name="人民出版社出版").first()
print(publish_obj.book_set.all())
for obj in publish_obj.book_set.all():
print(obj.title) 书名逐一显示
多对多、
正向查询,按字段:
python这本书所有作者的名字
book_obj = Book.objects.filter(title="python").first()
book_obj.authors.all()
反向查询,按表明小写_set:
alex出版过的所有书籍名称
alex = Author.objects.filter(name="alex").first()
方法一:alex.book_set.all()
方法二(这是设置related_name='bookList'方法):alex.bookList.all()
一对一、
正向查询,按字段:
查询alex的手机号
alex = Author.objects.filter(name="alex").first()
alex.ad.telephone
反向查询,按表明小写:
以151开头的手机号的作者的名字
ad = AuthorDetail.objects.get(telephone__startswith="151")
ad.authour.name
2、基于Queryset和__(sql:join语句):
正向查询,按字段
反向查询,按表明小写
一对多、(Publish--Book)
正向查询,按字段:
查询python这本书的出版社所在名称
Book.objects.filter(title="python").values("publish__name")
for obj in Book.objects.filter(title="python"):
temp={}
temp["publish__name"] = obj.publish.name
反向查询,按表明小写:
人民出版社出版过的所有书籍名称
Publish.objects.filter(name="人民出版社出版").values("book__title")
多对多、
python这本书所有作者的名字
Book.objects.filter(title="python").values("authors__name")
alex出版过的所有书籍名称
Author.objects.filter(name="alex").values("book__title")
一对一、
正向查询,按字段:
查询alex的手机号
Author.objects.filter(name="alex").values("ad__telephone")
以151开头的手机号的作者的名字
AuthorDetail.objects.filter(telephone__startswith="151").values("author__name")
三、拓展
eg1:
查询python这本书的出版社所在名称
Book.objects.filter(title="python").values("publish__name")
Publish.objects.filter(book__title="python").values("name")
eg2:
以151开头的手机号的作者的名字
AuthorDetail.objects.filter(telephone__startswith="151").values("author__name")
Book.objects.filter(authors__ad__telephone__startswith="151").values("title","publish__name")