多表操作(一对多)

遇到的问题:

执行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,写其他的也会出错。

最新文章

  1. Java多线程总结之线程安全队列Queue
  2. jquery回车执行某个事件
  3. Android--Sensor传感器
  4. POJ 2418
  5. [转]oracle 实现插入自增列
  6. UVa 808 (建坐标系、找规律) Bee Breeding
  7. jQuery实现鼠标移到元素上动态提示消息框效果
  8. Android消息机制(2)
  9. OpenStack core components CLI快速调用API
  10. Cocos2d-x教程(28)-ttf 字体库的使用
  11. bootcss
  12. EclipseAndroid打包签名发布安装失败闪退运行不了
  13. Powershell Linux正式版可用,启动名称有变
  14. js 取数组中某个对象的集合
  15. Android 蓝牙4.0 BLE (onServicesDiscovered 返回 status 是 129,133时)
  16. ownCloud安卓android客户端版本2.9.3
  17. web工程启动时,在一个类中延迟加载Bean,因为该Bean类可能还没被JVM加载
  18. 【Java初探03】——流程控制语句
  19. PHP多种序列化/反序列化的方法
  20. logcat -- 基本用法

热门文章

  1. Spirng boot maven多模块打包不踩坑
  2. linux pstree命令
  3. flask 下载本地文件
  4. Jenkins+PowerShell持续集成环境搭建(四)常用PowerShell命令
  5. codeforces492C
  6. Java常用调试技巧(转)
  7. 使用coobird Thumbnailator生成缩略图
  8. HTML知识点总结[部分]
  9. Git——快速安装Git及初始化配置【二】
  10. springboot 简单搭建