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基础(查询补充)的主要内容,如果未能解决你的问题,请参考以下文章