表关系的分类
(一)多表查询
一对一: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.ManyToManyField
2. 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)

被折叠的 条评论
为什么被折叠?



