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
    
    
    
原文地址:https://www.cnblogs.com/x-h-15029451788/p/11912548.html