表关系的分类
(一)多表查询一对一:models.OneToOneField(to_field='id',to='Authordatil')一对多:(外键设置唯一性)models.ForeignKey(to='Publish',to_field='id')多对多:自动生成第三张表models.ManyToManyField(to='Author')
1.一对一
注意:将外键建在哪一方都可以,但是最好建在查询次数多的有一方
以作者表和作者详情表为例 null=True 数据库是null
blank=True 字段没被赋值不会报错
unique=True 索引-----唯一
#作者表
class Author(models.Model):name = models.CharField(max_length=32)age = models.IntegerField()#作者与作者详情表 一对一authordetail = models.OneToOneField(to='AuthorDetail',on_delete=models.CASCADE)
#作者详情表
class AuthorDetail(models.Model):phone = models. BigIntegerField()addr = models .CharField(max_length=64)
2.一对多关系
一对多关系,将字段建在多的一方
以图书表和出版社表为例 一本图书只有一个出版社;一个出版社可以有多本书
#图书表
class Book(models.Model):title = models.CharField(max_length=32)price = models.DecimalField(max_digits=8,decimal_places=2)publist_data = models.DateField(auto_now_add=True)avatar = models.ImageField(upload_to='uploads', verbose_name='商品图片')#图书表与出版社表简历关系 一对多 外键建立在图书表publist = models.ForeignKey(to="Publish",on_delete=models.CASCADE)#图书表与作者表建立表关系 多对多 表关系建立在查询多的一方author = models.ManyToManyField(to='Author')
#出版社表
class Publish(models.Model):name = models.CharField(max_length=32)addr = models.CharField(max_length=64)email = models.EmailField()
3.多对多关系的三种创建方式
以图书表和作者表为例
3.1 全自动的
特点:拓展性不好
class Book(models.Model):title = models.CharField(max_length=32)authors = models.ManyToManyField(to='Author')
3.2 半自动
class Book(models.Model):title = models.CharField(max_length=32)# authors = models.ManyToManyField(to='Author',# through='Book2Author',# through_fields=('book', 'author')# )
"""
注意:1. 还是需要一个虚拟字段authors----->models.ManyToManyField2. through:指定第三张表的表名3. through_fields:指定第三张表里面哪两个字段是关系字段4. through_fields=('author', 'book')里面的两个字段是有顺序要求的5. 这种方式是可以支持正反向查询的,但是不能使用那4个方法了,add remove set clear
"""
class Author(models.Model):name = models.CharField(max_length=64)books = models.ManyToManyField(to='Book',through='Book2Author',through_fields=('author', 'book'))# 极大的好处:扩展性高了
class Book2Author(models.Model):book = models.ForeignKey(to='Book', on_delete=models.CASCADE)author = models.ForeignKey(to='Author', on_delete=models.CASCADE)bind_time = models.DateTimeField(auto_now_add=True)
3.3 纯手动
2. 我们自己来创建第三张表:纯手动
class Book(models.Model):title = models.CharField(max_length=32)class Author(models.Model):name = models.CharField(max_length=64)# 极大的好处:扩展性高了
class Book2Author(models.Model):book = models.ForeignKey(to='Book', on_delete=models.CASCADE)author = models.ForeignKey(to='Author', on_delete=models.CASCADE)bind_time = models.DateTimeField(auto_now_add=True)