Django之model基础(查询补充)

Posted Sober--

tags:

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

    学习完简单的单表查询外,是远远不够的,今天我们对查询表记录做一个补充,接下来来看看基于对象的跨表查询、基于双下划线的跨表查询,聚合查询和分组查询,F查询与Q查询。

比如我们有如下一张表,在model中,模型建立如下:

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")
 
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)
    keepNum=models.IntegerField()<br>    commentNum=models.IntegerField()
 
    # 与Publish建立一对多的关系,外键字段建立在多的一方
    publish=models.ForeignKey(to="Publish",to_field="nid")
 
    # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表
    authors=models.ManyToManyField(to=Author)

 

基于对象的跨表查询

1.一对多

正向查询(按字段:publish)

(通过书查询出版社)
#查询nid=1的书籍的出版社所在的城市 如果按字段publish来查询,先找到出版社对象,即 model.Book.object.filter(nid=1).publish 过滤出所有nid=1的书籍所在的出版社对象,拿到的是一个Queryset集合对象 最终的查询语句为 book_obj=Book.objects.filter(nid=1) print(book_obj.publish.city) # book_obj.publish 是nid=1的书籍对象关联的出版社对象 

反向查询(按表名:book_set)

(通过出版社查询书)
查询人民出版社社出版过的书的名字

publish_obj=models.publish.object.filter(name=‘人民出版社‘) #查询出人民出版社
book_list=publish_obj.book_set.all()  对出版社对象与书籍对象进行关联,拿到与该出版社社相关的所有书籍对象
for book_obj in book_list:
   print(book_obj.title)

2.一对一

author和authordetail为一对一的关系

正向查询(按字段:authorDetail)

# 查询egon作者的手机号(通过author====>authordetail)
autho_egon=models.author.object.filter(name=‘egon‘)
autho_egon.authordetail.tel

反向查询(按表名:author)

# 查询所有住址在北京的作者的姓名
authorDetail_list=models.authordetail.object.filter(addr=‘北京‘)
for obj in authorDetail_list:
print(obj.author.name

3.多对多

正向查找(按字段:)

 

以上是关于Django之model基础(查询补充)的主要内容,如果未能解决你的问题,请参考以下文章

67django之模型层(model)--查询补充及mookie

django-model之Q查询补充

Django之Models

django--模型层(orm)-查询补充及cookie

64django之模型层(model)--建表查询删除基础

Python - Django - ORM 分组查询补充