• 第一篇-Django建立数据库各表之间的联系(上)


    多表操作(一对多)

    遇到的问题:

    执行python manage.py makemigrations后报如下错误

      TypeError: __init__() missing 1 required positional argument: 'on_delete'

    这是外键导致的, 修改外键连接代码如标红部分。

    class Book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey("Publish",on_delete=models.CASCADE)
    

    执行python manage.py migrate生成数据库表,在此之前看清用的数据库是哪一个,默认是sqlite3,不过约束性不强,我们习惯用mysql。

    删掉目录下面的db.sqlite3。到settings.py里面注释掉原本的

    # DATABASES = {
    #     'default': {
    #         'ENGINE': 'django.db.backends.sqlite3',
    #         'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    #     }
    # }
    

     然后添加自己的数据库信息

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'NAME': 'ORM_multi',#你的数据库名称
            'USER': 'root',#你的数据库用户名
            'PASSWORD': '******',#你的数据库密码
            'HOST': '',#你的数据库主机,留空默认为localhost
            'PORT': '3306',#你的数据库端口
        }
    }
    

     用的mysql8.0.12,安装方法参考

    https://m.jb51.net/show/146051

    打开数据库:

    在运行窗口输入cmd,在命令窗口输入mysql -u root -p 密码进入数据库

    show databases;  查看数据库

    create database ORM_multi;  新建一个ORM_Multi的数据库供程序使用。

    接着在Django项目下的ORM_multi目录下的__init__.py文件里面写

    import pymysql
    pymysql.install_as_MySQLdb()
    

     在models.py里面添加表格。

    from django.db import models
    
    # Create your models here.
    
    class Book(models.Model):
        name=models.CharField(max_length=20)
        price=models.IntegerField()
        pub_date=models.DateField()
        publish=models.ForeignKey("Publish",on_delete=models.CASCADE)
    
        def __str__(self):
            return self.name
    
    class Publish(models.Model):
        name=models.CharField(max_length=32)
        city=models.CharField(max_length=32)
    

     打开pycharm下面的terminal命令行窗口运行python manage.py makemigrations和python manage.py migrate建立表格Book和Publish。

    这个时候我们可以去数据库里面Check一下表格有没有创建成功。

    mysql> use orm_multi;
    Database changed
    mysql> show tables;
    +----------------------------+
    | Tables_in_orm_multi        |
    +----------------------------+
    | app01_book                 |
    | app01_publish              |
    | auth_group                 |
    | auth_group_permissions     |
    | auth_permission            |
    | auth_user                  |
    | auth_user_groups           |
    | auth_user_user_permissions |
    | django_admin_log           |
    | django_content_type        |
    | django_migrations          |
    | django_session             |
    +----------------------------+
    12 rows in set (0.00 sec)
    

     app01_book和app01_publish就是我们创建的表。

    然后在pycharm里面看我们的数据库。点击右侧Database,点击“+”号,会弹出一个窗口

    填写相应的信息,选apply,ok。数据库就添加进来了。打开数据库中的app01_book表,插入一行数据,会发现不让插入,那是因为此时出版社publish表示空的,但是它是book的外键,外键不能为空,所以插入不了。

    所以优先添加出版社的信息,打开app01_publish表,添加

    添加和上传如图中红圈部分。此时在去book表中添加信息就不会报错了,注意:外键的id只能对应publish里面的id,即1,2,3,4,写其他的也会出错。

  • 相关阅读:
    Day 18
    Day 17
    Day 16
    Day 15
    Day 14
    Day 13
    Day 12
    Day 11
    Day 10
    《ES6标准入门》(阮一峰)--2.let 和 const 命令
  • 原文地址:https://www.cnblogs.com/smart-zihan/p/9889114.html
Copyright © 2020-2023  润新知