一对一的映射
- 语法:OneToOneField(类名,on_deletc = xxx)
class A(model.Model): ... class B(model.Model): a = model.OneToOneField(A,on_deletc = xxx) # on_delete是级联删除 关联的是主键联删除必须设置 ### 级联删除
- on_deletc
- model.CASCADF 级联删除,你删我就删
- model.PROTECT 抛出protectedError以组织被引用对象的删除
- model.SET_BULL 设置ForeignKey null;需要设置bull = True
- model.SET_DEFAULT 将ForeignKey设置为默认值,必须设置默认值DEFAULT
创建数据
A1 = A.objects.create(name = '王老师')
B1 = B.objects.create(name = 'aaa',a = A1)
# B1 = B.objects.create(name = 'aaa', a_id = 1) # 即王老师的id,这里必须是具体的值 1 or A1.id
查询数据
- 正向查询
b = B.objects.get(name = 'aaa') print(b.name,b.a.name) # aaa 和 王老师
- 反向查询
a = a.objects.get(name = "王老师") peint(a.name,a.b.name) #王老师 aaa
一对多的映射
- 语法:ForeignKey(类名,on_deletc = xxx)
class A(model.Model): ... class B(model.Model): a = model.ForeignKey(A,on_deletc = xxx) # on_delete是级联删除 关联的是主键级联删除必须设置 ### 级联删除
正向查询
和 一对一 一样
反向查询
a = A.objects.get(name = 'xxx')
b = a.b_set.all() # b_set是类名小写加_set 返回数据对象可进行其他操作
多对多
多对多表达对象之间多对多复杂关系,mysql中需要依赖于第三张表来实现,Django中无需手动创建第三张表,Django自动创建
- 语法:属性models.MangToManyField(mymodel)
创建数据
a1 = A.objects.create(name = 'aaa1')
a2 = A.objects.create(name = 'aaa2')
# a1,a2 绑定 b1
b1 = a1.b_set.create(name = 'bbb1')
a2.b_set.add(b1)
## 反着也可以创建
b2 = B.objects.create(name = 'bbb2')
a3 = b2.a_set.create(name = 'aaa3')
b2.a_set.add(a1)