Django ORM模型:创建表、添加数据、删除数据、跨表查询(子查询)
1.创建表
表说明:有如下4个表,图书表、出版社表、作者表、作者详细信息表、出版社表和图书表之间的关系是其中之一(外键写成一张桌子有几本书),即出版社可以有几本书;这本书和作者之间的关系是多对多的(多对多表需要另外一个关系表,外键可以写入任意表),即这本书可以有几本书,一个书。也可以有几个作者; 作者与作者的详细信息表是单向关系(外键可以写入任何表),即一个作者不能拥有与作者相关的详细信息,反之亦然。创建自定义表格如下:
classBook(models.Model):
nid=models.AutoField(primary_key=True)
title=models.CharField(max_length=32) .DateField . ( )
price=models.DecimalField(max_diits=5,decimal_places=2)
publish=models.ForeignKey("Publish") #与Publish表设置多对一关系publish_id字段会自动添加到此表
authors=models.ManyToManyField("Author") #与Author表创建多对多关系,并创建对应的book_authors关系表,包含id、book_id和authors_id字段
classPublish(models.模型):
nid=models.AutoField(primary_key=True)
name=models.CharField(max_length=32)❀电子邮件模型.模型):
nid=models.AutoField (primary_key=True) )
name=models.CharField(max_length=32)
age=models.IntegerField()Models() :
nid= models.AutoField(primary_key=True)
adrr=models.CharField(max_length=32)
email=models.EmailField()
作者=表。建立单个连接
2. 添加数据
1.其中之一
这里再举一些例子:
#方法一:
pub_obj = Publish.objects.get(name="沙河出版社") #传递给出版社添加的模型对象
Book.objects.create(title="金品梅",publishDate="2001-12-12",prix=122,publish=pub_obj)#方法二:
book_obj=Book.objects.create(title="金品美 3",publishDate="2011-08-12",prix=112,publish_id=1) #publish_id 对应的值必须在发布表中已知 已存在 id
2,多对多
下面是一些附加示例:
示例 1:创建 book 表信息时,将关系与 作者 的信息绑定
book_obj = Book.objects.create(title="金品美 3 ",publishDate="2011- 08 -12", Price=112,publish_id=1)
alex=Author.objects.get(name="alex") #识别作者模型对象
egon=Author.objects.get(name= " egon ") #获取已知的作者模型对象
book_obj.authors.add(alex,egon)#绑定关系
示例2:创建图书信息,然后链接到作者的关系(即添加作者信息):
book_obj=Book.objects.filter(title="金品美3")
book_obj.authors.add(温州)
示例3:添加多个查询对象:
book_obj = Book.objects.create(title="金品美5", 201Date , Price=112,publish_id=1)
authors=Author.objects.all() #queryset对象,列表形式
book_obj.authors.add (*authors) #*authors 将被添加到列表中 表单中的对象被占位符格式破坏
3. 删除数据
这里描述的是多对多表的移除和清理。执行此操作后,联系人表中关联的联系人也将被删除。删除还是删除。
1。删除作者
alex=Author.objects.get(name="alex")
book_obj=Book.objects.filter(title="金品美3").first()
book_obj.authors.remove (亚历克斯)
2。删除所有作者
book_obj = Book.objects.filter(title="金品美3").first()
book_obj.authors.clear()
4.基于对象的表匹配查询(子查询)
1. 1 对于一对多
对于一对多的情况,我们在建表中已经说明过,外键只能写在多个图书表中。出版商的版本称为预购版。向出版商提出的问题 所有出版的图书都称为反向查询。出题规则及示例如下:
出题规则:
.publish
(书籍-----(见出版社)----- -- ---> 发布)
示例1(高级查询):
#用python查询这本书的出版商名称:(高级查询,按字段)
book_obj=Book.objects .get(title="python ") print (book_obj.publish.name)
示例2(反向查询):
#查询沙河出版社出版的图书名称:(从:表名_set反向查询)
publish_obj=Publish 。 objects.get(name="沙河出版社") print(pub_obj.book_set.all()) #queryset对象
for book inpub_obj.book_set.all() :print(book.title)
2, Many -对多
对于多对多关系,建表时指定相关字段可以设置在任意表类中。本文发布在“图书”表上。如果查询一本书中的所有记录,这称为正向查询。查询作者写入的所有数据称为反向查询。以下为出题规则及示例:
出题规则:
.authors.all()(Books----------------(查看作者所有相关)- - ------------>作者)
示例1(前置问题):
#查询《红楼梦》书中所有作者的名字
book_obj=书.对象。 get(title="红楼梦")
print(book_obj.authors.all()) #作者要求
的所有作者 inbook_obj.authors .all(): print(author.name )
示例2(反向查询):
#查询alex 作者写的所有书籍的书名
author_obj=Author.objects.get(name= "alex")print(author_obj.(book_set.all). )) object #queryset for all related books
for book inauthor_obj.book_set.all():print(book.title)
3,一对一
对于单向关系,我们在建表时也说过,关系字段可以设置在任何表类中。本章以AuthorDetail表关联的author字段为例,使用作者Detail表查询作者。这是高级查询,使用字段即可;使用作者表查询对应的作者信息内容是反向查询,只需使用表名即可。具体应用示例如下:
示例一(初步查询):
#查询地址为沙河,作者姓名,有123封邮件(初步查询,在字段中)
detail_obj =AuthorDetail_obj= .objects。 get(adrr="Shahe",email="123")print(detail_obj.author.name)
示例2(反向查询):
# 查询名为Alex的作者地址(反向查询 , amin 'name table)
author_obj=Author.objects.get(name="alex")print(author_obj.authordetail.adrr)
三个例子(完整例子):
#问题名称作者住在沙河所有出版的书籍和出版社名称
authordetail=AuthorDetail.objects.get(addr="Shahe")
author=authordetail.author #正向查询,获取作者模型对象 = book .book_set.all () #反向查询,得到bookList查询集对象
for book inbookList:print(book.title,book.publish.name)
总结:上面的对话框中,查询的都是小写的表名,应该是请记住,在单个查询中,表名后面不需要跟集合,因为只有一个对象。通过“.table name”得到的是一个模型对象,可以直接查询需要的字段。
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。