多表操作(一对多)
遇到的问题:
执行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,写其他的也会出错。