基于双下划线查询
切记!!!!正向查询按字段,反向查询按表名的小写
正向:在Book表里设置关联Obj表,Book------>Obj就是正向查询
反向:在Book表里设置关联Obj表,Obj------>Book就是反向查询
废话不多说,直接上例子:
数据 class Book(models.Model): nid=models.AutoField(primary_key=True) title=models.CharField(max_length=32) price=models.DecimalField(max_digits=8,decimal_places=2) # 999999.99 pub_date=models.DateTimeField() # "2012-12-12" publish=models.ForeignKey(to="Publish",on_delete=models.CASCADE) # 级联删除 authors=models.ManyToManyField(to="Author") def __str__(self): return self.title class Publish(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField(max_length=32) email=models.CharField(max_length=32) def __str__(self): return self.name class Author(models.Model): nid = models.AutoField(primary_key=True) name=models.CharField(max_length=32) age=models.IntegerField() email=models.CharField(max_length=32) ad=models.OneToOneField(to="AuthorDetail",on_delete=models.CASCADE) def __str__(self): return self.name class AuthorDetail(models.Model): addr=models.CharField(max_length=32) tel=models.IntegerField() def __str__(self): return self.addr
以上是4张表,实际在操作中是5张表,有一张虚拟的表,Django自动给我们创建的
一下是各种查询的练习题
1 查询python这本书出版社的名字 2 查询人民日报出版社出版的所有的书籍的名称 3 查询python这本书籍的作者的年龄 4 查询李二短出版过的所有的书籍名称 5 查询任康娜的手机号 6 查询手机号为234的作者的名字 7查询老男孩出版社出版过的所有书籍的名字以及作者的姓名 8手机号以132开头的作者出版过的所有书籍名称以及出版社名称
答案:
1 查询python这本书出版社的名字 正向:ret = Book.objects.filter(title='python').values('publish__name') 反向:ret = Publish.objects.filter(book__title='python').values('name') print(ret)
2 查询人民日报出版社出版的所有的书籍的名称 ret = Publish.objects.filter(name='人民日报出版社').values('book__title')
ret = Book.objects.filter(Publish__name='人民日报出版社').values('title')
print(ret)
3 查询python这本书籍的作者的年龄
ret = Book.objects.filter(title='python').values('authors__age')
ret = Authors.objects.filter(book__title='python').values('age')
print(ret)
(以下反向查询不一一列举,具体参考前3个)
4 查询李二短出版过的所有的书籍名称
ret = Author.objects.filter(name='李二短').values('book__title') print(ret)
5 查询任康娜的手机号
ret = Author.objects.filter(name='任康娜').values('ad__tel') print(ret)
6 查询手机号为234的作者的名字
ret = AuthorDetail.objects.filter(tel=234).values('author__name') print(ret)
7查询老男孩出版社出版过的所有书籍的名字以及作者的姓名
ret = Publish.objects.filter(name='老男孩出版社').values('book__title','book__authors__name') print(ret)
8手机号以132开头的作者出版过的所有书籍名称以及出版社名称
ret = AuthorDetail.objects.filter(tel__startswith=345).values('author__book__title','author__book__publish__name') print(ret)