一、表与表之间关系的处理
1、一对多的关系:
举个例子,例如出版社与书,一个出版社可以有多本书进行出版,但是书只能是一个出版社出版,这样就形成了一对多的数据关系,这个时候需要书通过外键的方式连接到出版社的表,即publisher=models.ForeignKey(to="Publisher"),在Book下的字段publisher即从Publisher表获取的一个对象
#出版社
class Publisher(models.Model):
'''出版社数据表'''
id=models.AutoField(primary_key=True) #自增ID主键
name=models.CharField(max_length=50,verbose_name='出版社名称',null=False,unique=True)
addr=models.CharField(max_length=128,verbose_name='出版社地址',default='成都市动物园')
def __str__(self):
return '{},{}'.format(self.id,self.name,self.addr)
#书
class Book(models.Model):
'''书数据表'''
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=50,verbose_name='书名',null=False,unique=True)
publisher=models.ForeignKey(to="Publisher")
def __str__(self):
return '{},{},{}'.format(self.id,self.title,self.publisher)
2、多对多的关系 :
举个例子,比如书与作者,书可以是多个作者合作写出来的,那么作者可以写很多本书,那么书和作者的关系就是多对多的关系,这个时候需要通过第三张表来体现书与作者的关系,即在作者的类中添加book=models.ManyToManyField(to='Book'),Django会自动添加第三张表来体现多对多的关系
#书
class Book(models.Model):
'''书数据表'''
id=models.AutoField(primary_key=True)
title=models.CharField(max_length=50,verbose_name='书名',null=False,unique=True)
publisher=models.ForeignKey(to="Publisher")
def __str__(self):
return '{},{},{}'.format(self.id,self.title,self.publisher)
#作者
class Author(models.Model):
'''作者数据表'''
id=models.AutoField(primary_key=True)
name=models.CharField(max_length=50,verbose_name='作者名称',null=False,unique=True)
book=models.ManyToManyField(to='Book') #Django自动建立多对多关系表
二、数据库相关操作
1. 单表增删改查
增:
models.Publisher.objects.create(name="沙河出版社")
查:
models.Publisher.objects.get(id=1)
models.Publisher.objects.get(name="沙河出版社")
删:
models.Publisher.objects.get(id=1).delete()
改:
obj = models.Publisher.objects.get(id=1)
obj.name = "沙河第二出版社"
obj.save()
2、外键的增删改查
增、删、查同上
改:
book_obj = models.Book.objects.get(id=1)
book_obj.publisher 是什么?
和我这本书关联的出版社对象
book_obj.publisher.id 和我这本书关联的出版社的id值
book_obj.publisher.name 和我这本书关联的出版社的名称
book_obj.publisher_id 是什么?
和我这本书关联的出版社的id值
3.、多对多操作
3.1、查id为1的作者都写过的书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.all() --> 和我这个作者关联的所有书对象
3.2、想给作者绑定多本书?
author_obj = models.Author.objects.get(id=1)
author_obj.books.set([1,2,3]) --> 把id是1、2、3的书和我这个作者关联上