Code前端首页关于Code前端联系我们

Django ORM模型:创建表、添加数据、删除数据、跨表查询(子查询)

terry 2年前 (2023-09-24) 阅读数 55 #后端开发

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前端网发表,如需转载,请注明页面地址。

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

热门