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')

  

 

posted @   -零  阅读(297)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示