四、Django学习之关系表介绍及使用
关系表介绍及使用
一对一关系
xx = models.OneToOneField(to='表名',to_field='字段名',on_delete=models.CASCADE) #on_delete:删除时的一些级联效果,to_field可以不写,默认是关联到另一张表的主键,on_delete在1.x版本的django中不用写,默认是级联删除的,2.x版本的django要写.
增加数据
方式1
new_author_detail = models.AuthorDetail.objects.create( birthday='1979', telephone='138', addr='black' ) # 方式1 models.Author.objects.create( name='王涛', age=18, #直接将对象赋值属性 authorDetail=new_author_detail )
方式2
new_author_detail = models.AuthorDetail.objects.create( birthday='1979', telephone='138', addr='black' ) # 方式2 models.Author.objects.create( name='王涛', age=18, authorDetail_id=new_author_detail.id )
删除数据
表一外键关联到表二,表一删除,不影响表2,表2删除会影响表1
models.AuthorDetail.objects.get(id=2).delete() models.Author.objects.get(id=3).delete()
更新数据
models.Author.objects.filter(id=5).update( name='崔老师', age=16, authorDetail=models.AuthorDetail.objects.get(id=5), authorDetail_id=4, )
一对多关系
xx = models.ForeignKey(to='表名',to_field='字段名',on_delete=models.CASCADE)
增加数据
方式1
外键关联的直接赋值为某个对象即可
obj = models.Publish.objects.get(id=1) models.Book.objects.create( title='李帅', publishDate='2019-07-22', price=3, publishs=obj )
方式2
obj = models.Publish.objects.get(id=1) models.Book.objects.create( title='李帅test', publishDate='2019-07-22', price=3.5, publishs_id=1 #可以是整型,也可以是对象的属性(id) #publishs_id=obj.id )
删除数据
models.Publish.objects.get(id=1).delete() models.Book.objects.get(nid=1).delete()
更新数据
models.Book.objects.filter(pk=4).update( title='B哥的往事2', publishs=models.Publish.objects.get(id=3), publishs_id=3, #注意级联关系 不能乱改 )
多对多关系
xx = models.ManyToManyField(to='另外一个表名') #这是自动创建第三表
添加数据
book_obj = models.Book.objects.get(nid=1) book_obj.authors.add(*[1,2])
删除数据
book_obj = models.Book.objects.get(nid=6) book_obj.authors.remove(6)#将某个特定的对象从被关联对象集合中去除。 book_obj.authors.remove(*[5,6]) book_obj.authors.clear() #情况与nid 6相关联的所有 book_obj.authors.add(*[1,])#添加表记录 book_obj.authors.set('1')#先清空然后在设置 book_obj.authors.set(['5','6']) #删除然后更新
示例
from django.db import models # Create your models here. from django.db import models # Create your models here. #作者表 class Author(models.Model): #比较常用的信息放到这个表里面 name=models.CharField( max_length=32) age=models.IntegerField() # authorDetail=models.OneToOneField(to="AuthorDetail",to_field="nid",on_delete=models.CASCADE) authorDetail=models.OneToOneField(to='AuthorDetail') #一对一到AuthorDetail表 生成为表字段之后,会自动变为authorDetail_id这样有一个名称 # 外键字段 -- 外键字段名_id # foreign+unique def __str__(self): return self.name #作者详细信息表 class AuthorDetail(models.Model): birthday=models.DateField() # telephone=models.BigIntegerField() telephone=models.CharField(max_length=32) addr=models.CharField( max_length=64) def __str__(self): return self.addr #出版社表 和 书籍表 是 一对多的关系 class Publish(models.Model): name=models.CharField( max_length=32) city=models.CharField( max_length=32) email=models.EmailField() #charfield -- asdfasdf def __str__(self): return self.name #书籍表 class Book(models.Model): nid = models.AutoField(primary_key=True) title = models.CharField( max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_places=2) #decimal(16,2) publishs=models.ForeignKey(to="Publish") authors=models.ManyToManyField(to='Author',) def __str__(self): return self.title