14.Django(多表的建表、多表涉及的字段、利用amdin操作数据库)
-
多表的关系
一对一:一个表的字段有且只对应领一个表的字段
多对一:站在两张表的角度,左表的多个字段可以对应右表的一个字段,右表的一个多个字段不能对应左表的一 个字段,这就是单项的多对一,也就是多对一。
多对多:站在两个表的角度,左表的多个字段可以对应右表的一个字段,右表的多个字段也可以对应左表的一个 字段,这就是双向的多对一,也就是多对多。
-
创建一个新的项目manytbles
pass
-
研究下面几张表
-
具体分析
1、先明确我们有四张表
Author:作者表
AuthorDetail:作者详细信息表
Publish:出版社
Book:书籍2、作者表与详细信息表
-
作者表
class Author(models.Model):
name = models.CharField(max_length=32)
age = models.IntegerField()orm在生成表的时候,如果你表没有设置id字段,它会自动给你设置一个id字段,并且将其设置为自增的、主键。
通过连接数据库并且生成了一个app01_author表,验证了,给我们添加了自增的主键的id
-
为什么要将一个作者表分为作者表和作者详细表?
我们一般查询作者信息时,经常用到的就是类似与name、age。详细表中的那些字段是不常用的。我们设置两张表,可以提升我们的查询效率,还有就是我i们要研究一对一表的关系。
-
如何确定这两张表的一对一关系?
一对一的约束:foreign key + unique,那么这个字段可以建立在哪张表上面?
我建议建立在作者表上。
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)
# authorderail = 受AuthorDetail的id字段的限制,建议这个字段建立在作者表上。
# to = 'AuthorDetail' 这个字段关联的是AuthorDetail表。
# to_field = 'nid' 受AuthorDetail表的nid字段的限制 (可以不写)
# on_delete=models.CASCADE 级联删除由于Django版本不同,主要是1.x与2.x版本,设置也不同。
1、 1.x版本中
不同单独设置on_delete=models.CASCADE属性,它默认就是级联删除。如果不想设置级联删除可以配置此属性on_delete=models.SET_NULL
2、2.x版本中
需要手动设置on_delete=models.CASCADE属性,他默认不是级联删除
无论Django的1.x还是2.x都不能配置级联更新
其实上面的语句可以简写:
authordetail = models.OneToOneField(to='AuthorDetail', on_delete=models.CASCADE)
-
最终代码
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):
birthday = models.DateField()
telephone = models.CharField(max_length=14)
addr = models.CharField(max_length=16)
-
3、研究出版社Publish表以及书记Book表
-
-
研究完了这两张表的关系,多对一的关系中,建立的关联字段要建在‘多’的那张表中。所以这个外键一定要建立在book中。
class Publish(models.Model):
name = models.CharField(max_length=12)
city = models.CharField(max_length=32)
email = models.CharField(max_length=24)
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
Publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)4、研究作者表与书籍表的关系。
那么多对多的关系你如何确定?mysql之前学过,如果是多对多的关系,我们要创建第三张表。
通过orm创建第三张表有三种方式
-
方式1:
手动创建第三种表,orm中不推荐这种方式,如果你手动创建的第三张表,orm的提供的很多功能,是不支持的,如果你做一些大型项目,其中涉及到的第三张表除了有两个表的id字段以外还有一些其他的字段,这种情况下,你需要使用方式1。
-
方式2:(推荐)
在这两张表中的任意一张表,建立一个多对多字段,orm会通过这个字段自动帮你生成一个第三张表,我们哦通过这个字段对第三章表进行增删改查数据,这种方式支持orm提供的功能
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
Publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
author = models.ManyToManyField(to='Author')细节:
author = models.ManyToManyField(to='Author')
author = models.ManyToManyField(to=Author)
关联的表可以是字符串的形式也可以直接表名的形式。唯一的区别是如果是字符串形式,无需在考虑哪张表在上面,哪张表在下面。一般用于字符串形式。
5、最终的表结构如下
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', on_delete=models.CASCADE)
class AuthorDetail(models.Model):
birthday = models.DateField()
telephone = models.CharField(max_length=14)
addr = models.CharField(max_length=16)
class Publish(models.Model):
name = models.CharField(max_length=12)
city = models.CharField(max_length=32)
email = models.CharField(max_length=24)
class Book(models.Model):
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
Publish = models.ForeignKey(to='Publish', on_delete=models.CASCADE)
author = models.ManyToManyField(to='Author')6、捋顺一下这几张表的结构
-
-
-
7、生成表结构
python manage.py makemigrations
python manage.py migrate细节:
一对一,多对一,多对多,这些外键字段,在形成真正的表结构时,会在你设置的字段后面拼接一个_id
多表涉及的字段
一对一的字段:
OneToOneField()
to= :设置要关联的表
to_field= :设置要关联的字段
on_delete= :联级删除
多对一的字段:
ForeignKey()
to= :设置要关联的表
to_field= :设置要关联的字段
related_name= :反向操作时,使用的字段名,用于代替原反向查询时的‘表名_set’
related_query_name : 反向查询操作时,使用的连接前缀,用于替换表名
on_delete= :联级删除
多对多的字段:
ManyToManyField()
to= :设置要关联的表
to_field= :设置要关联的字段
related_name= :反向操作时,使用的字段名,用于代替原反向查询时的‘表名_set’
related_query_name : 反向查询操作时,使用的连接前缀,用于替换表名
through:在使用ManyToManyField字段时,Django将自动生成一张表来管理多对多的关联关系
但我们也可以手动创建第三章表来管理多对多的关系,此时就需要通过through来指定第三张表的表名
through_fields:设置关联的字段
db_table:默认创建第三张表时,数据库中的表的名称
利用admin软件操作数据库
-
操作数据库的几种方式
1、直接通过cmd操作
2、pymysql操作
3、navicat操作
4、orm操作
5、Django提供的可视化工具
6、引用外部文件操作
7、Django提供的admin系统操作
-
admin就是Django给你提供了一个数据库管理系统,可以让你非常方便的操作数据表尤其是多表的,并且还有权限等更多的功能。
在Terminal终端注册:密码是8位以上的
输入:python manage.py createsuperuser
Username:
Email address: (直接回车跳过)
Password: (8为以上)
Password(again):
-
相关配置
在应用里面的admin.py 里面写入下面代码:
from django.contrib import admin
from . import models
# Register your models here.
admin.site.register(models.Book)
admin.site.register(models.Author)
admin.site.register(models.AuthorDetail)
admin.site.register(models.Publish)
-
登录admin数据库管理系统
项目启动:访问: