Django orm查询操作

Posted lzqrkn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django orm查询操作相关的知识,希望对你有一定的参考价值。

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

 


























以上是关于Django orm查询操作的主要内容,如果未能解决你的问题,请参考以下文章

Django - - 基础 - - Django ORM常用查询语法及进阶

Django(17)orm查询操作

Django - ORM操作

django orm 的查询条件

Django orm查询操作

Django框架05 /orm单表操作