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账户

    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)
posted @ 2020-06-03 20:29  牧羊小董  阅读(216)  评论(0)    收藏  举报