Django之Models(二)
Django之Models(二)
创建一对多的关系
1 2 | 一个出版商可以有多本出版的书 一本书只有一个出版商 |
创建一对多的语法:
1 | 字段名 = models.ForeignKey(关联表(类名),on_delete = [选项]) <br>注意:这里外键字段名不要在加上 id ,默认会加上。<br>我在这里加上了 ID ,会变成publisherID_id。 |
1 from django.db import models 2 3 # Create your models here. 4 5 6 7 class Publisher(models.Model): 8 name = models.CharField(max_length=30) 9 city = models.CharField('城市',max_length=60) 10 11 class Book(models.Model): 12 name=models.CharField(max_length=20) 13 price=models.IntegerField() 14 pub_date=models.DateField() 15 author=models.CharField(max_length=32,null=False) 16 publisherID= models.ForeignKey(Publisher,on_delete=models.SET)
报错:TypeError: __init__() missing 1 required positional argument: 'on_delete'
注意:一定要加上on_delete参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <strong> on_delete参数的各个值的含义: on_delete = None , # 删除关联表中的数据时,当前表与其关联的field的行为 on_delete = models.CASCADE, # 删除关联数据,与之关联也删除 on_delete = models.DO_NOTHING, # 删除关联数据,什么也不做 on_delete = models.PROTECT, # 删除关联数据,引发错误ProtectedError # models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True) on_delete = models.SET_NULL, # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) # models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值') on_delete = models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) on_delete = models. SET , # 删除关联数据, a. 与之关联的值设置为指定值,设置:models. SET (值) b. 与之关联的值设置为可执行对象的返回值,设置:models. SET (可执行对象) < / strong> |
增加数据
1 2 3 4 5 6 7 8 9 | 方式一: #publisherID_id=2:通过赋值的办法 Book.objects.create(name = "linux运维" ,price = 77 ,pub_date = "2019-02-10" ,author = "",publisherID_id = 2 ) 方式二: #publisherID=publish_obj:通过赋值对象的办法 publish_obj = Publish.objects. filter (name = "人民出版社" )[ 0 ] #这里filter返回是一个集合对象,使用需要[]取出来用 Book.objects.create(name = "linux运维" ,price = 77 ,pub_date = "2019-02-10" ,author = "",publisherID = publish_obj) |
查询数据
正向查询
1 2 3 4 5 6 7 8 9 | # book_obj=Book.objects.get(name="python") # print(book_obj.name) print (book_obj.price) print (book_obj.pub_date) print (book_obj.author) # 如何拿到与它绑定的Publisher对象呢? # 一对多:这里外键publisherID一定是一个对象 # print(book_obj.publisherID.name) # print(book_obj.publisherID.city) |
反向查询
1 2 3 4 5 6 | pub_obj = Publisher.objects. filter (name = "人民出版社" )[ 0 ] print (pub_obj.name) print (pub_obj.city) #pub_obj.book_set是一个queryset集合 #如何拿到与它绑定的Book对象呢? print (pub_obj.book_set. all ().values( 'name' , 'price' )) |
(filter valuse 双下划线)
1 2 3 | #正向查询:通过外键__字段 python的出版商 ret1 = Book.objects. filter (name = "python" ).values( "publisherID__name" )) |
1 2 3 4 | #反向查询:通过表名__字段 python的出版商 ret1 = Publisher.objects. filter (book__name = 'python' ).values( 'name' ) |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?