Django orm查询操作

时间:2021-03-10 02:57:35

基于双下划线查询
切记!!!!正向查询按字段,反向查询按表名的小写
正向:在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)