表关系分析与创建

 表关系的分类

(一)多表查询

    一对一: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)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值