Django多表操作
多表操作
'好朋友胡斌在当今社会结婚后 发现我国的婚姻法规定中国执行的是一夫一妻制.结婚后老婆生了三个儿子, 有一天老婆问他儿子的爸爸是谁 ,他很骄傲的说儿子们的爸爸肯定是我,就是一对多的关系,她老婆笑着说:我和儿子是一对多关系,你就不一定了,有可能也是多对多关系!........胡斌红着脸就打开了电脑,就学起Django中的多表关系,还意淫着穿越到唐朝,享受一夫多妻制的性福生活.'
一.创建模型
'表和表之间的关系:
list1:老公表
list2:老婆表
list3:孩子表
list4:幼儿园小朋友表
'注意:假设胡斌的老婆比较浪,他和孩子没有关系
根据上面的小故事大家就会容易的明白老公和老婆是一对一的关系,老婆(妈妈)和孩子就是一对多的关系,孩子和幼儿园小朋友的表是多对多的关系(同学关系) 根据浅显的逻辑我们就可以建立关系表结构.
老公表
class Husband(models.Model):
name=models.CharField(max_length=True)
age=models.IntegerField()
老婆(妈妈)表
class Wife(models.Model):
name=models.CharField(max_length=True)
age=models.IntegerField()
husbands=models.OneToOneField(to='HUSBAND',on_field=models.CASCADE)
孩子表
class Children(models.Model):
name=models.CharField(max_length=True)
age=models.IntegerField()
wifes=models.ForeignKey("Wife",on_delete=models.CASCADE)
小朋友表
class Friend(models.Model):
name=models.CharField(max_length=True)
age=models.IntegerField()
Childrens=models.ManyToManyField(to='Children',)
表建立好了就可以使用数据库迁移在指定的数据库进行数据库迁移
python3.6 manage.py makemigration
python3.6 migrate
增加
'一对一:'
models.Husband.objects.create(
name='胡斌'
age='17')
models.Wife.objects.create(
name='东盟'
age='17'
husbands=models.Husband.objects.get(id=1))
models.Wife.objects.create(
name='东盟'
age='17'
husbands=2
'一对多:'
models.Children.objects.create(
name='小胡斌'
age = '2'
wifs=models.Wife.objects.get(id=1))
models.Children.objects.create(
name='小胡斌'
age = '2'
wifs='1'
'多对多:'
'方式一:
friend_obj=models.Friend .objects.get(id=1)
child1=models.Children.objects.get(id=1)
child2=models.Children.objects.get(id=2)
friend_obj.childrens.add(child1, child2)
'或者
friend_obj.childrens.add(*[child1, child2])
'方式二:
friend_obj=models.Friend .objects.get(id=1)
friend_obj.childrens.add(1,2)
'或者
friend_obj.childrens.add(*[1,2])
删除
胡斌看见老婆浪的很就想着离婚:
' 一对一 和一对多的删除直接delete
models.Wife.objects.get(id=1).delete()
'多对多的删除
friend_obj=models.Friend .objects.get(id=1)
friend_obj.childrens.remove(3) '删除' '就是孩子和小朋友打架了,从此解除了朋友关系'
friend_obj.childrens.remove(2,3)
friend_obj.childrens.clear() '清空'
'修改操作':
friend_obj.childrens.set('4',) "就是先清空在添加"==clear + add
修改
'修改 update,一对一 和一对多操作时就是和单表操作一样的'
models.Wife.objects.filter (id=1).update(
name='丁杰',
age='12',
)
'有一天,小胡斌发现他真正的好朋友不是现在的需要喊一个,这时候就发成了修改多对多的关系'
models.Children.objects.filter (id=1).update(
name='小熊熊帅哥',
age='5',
childrens=models.Children.objects.get(id=6)
'或者'
childrens_id=3
查询
基于对象的跨表查询
一对一
正向查询
查询东盟的老公的名字
husband_obj=models.Wife.objects.get(name='东盟')
husband_obj.husbands.name 'husbands就是外键也就是老婆表中的一个属性''就是属性有关系'
反向查询
查询胡斌的老婆叫啥
wife_obj=models.Husband.objects.get(name='胡斌').first()
wife_obj.wife.name '反向查询的就是与相关的类有关系'
一对多
正向查询
小胡斌是谁生的
ret = models.Children.objects.filter(name='小胡斌').first()
ret.childrens.name
反向查询
东盟生了那些孩子
ret=models.Wife.objects.filter(name='东盟')
childs=ret.children_set.all().values('name')
# 多对多
# 正向查询
# 白洁新版这本书的作者都有谁
# book_obj = models.Book.objects.filter(title='白洁新版').first()
# authors = book_obj.authors.all().values('name')
# print(authors)
# 反向查询
# 查询一下金龙2写了哪些书
jinlong2_obj = models.Author.objects.get(name='金龙2')
ret = jinlong2_obj.book_set.all().values('title')
print(ret)
总结:正向查询靠属性
反向查询靠小写类名_set
不想被生活强奸,就想办法去强奸生活