文章目录
MySQL中表之间的关系
与MySQL中表之间的关系类似:
一对多,多对多,一对一。
mysql建立关系方法:
https://blog.csdn.net/Light__1024/article/details/88344675
https://blog.csdn.net/Light__1024/article/details/88342893
django中处理方法:
- 一对多,在多的表中建立关联字段
- 多对多,建立第三张关系表关联俩表
- 一对一,表中建立关联字段 + unique设置成唯一
- 可以建立关联字段,但不一定非要建立约束关系。
orm生成关联表模型
以出版社,书,作者,作者详情四张表为例,出版社和书是一对多,书和作者是多对多,作者和作者详情表是一对一。
1、建立被关联的单表,出版社表和作者详情表
# 作者详情表
class AuthorDetail(models.Model):
nid = models.AutoField(primary_key=True)
birthday = models.DateField()
telephone = models.BigIntegerField()
addr = models.CharField(max_length=64)
# 出版社表
class Publish(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
city = models.CharField(max_length=32)
email = models.EmailField()
2、建立一对多,多对多
class Book(models.Model):
nid = models.AutoField(primary_key=True)
title = models.CharField(max_length=32)
publishDate = models.DateField()
price = models.DecimalField(max_digits=5, decimal_places=2)
# 一对多关系,在book里生成字段,关联字段publish自动拼_id, to=位置表,to_field=字段,不加默认主键id
# 只要用到foreign key 要加上 on_delete=models.CASCADE 2.0以上不加报错
publish = models.ForeignKey(to="Publish", to_field="nid", on_delete=models.CASCADE, )
'''
publish_id INT ,
FOREIGN KEY (publish_id) REFERENCES publish(id)
'''
# 多对多,不在book里生成字段,会生成第三表,名字由语法坐在表book和定义authors自动拼成是book_authors
authors = models.ManyToManyField(to="Author")
'''
CREATE TABLE book_authors(
id INT PRIMARY KEY auto_increment ,
book_id INT ,
author_id INT ,
FOREIGN KEY (book_id) REFERENCES book(id),
FOREIGN KEY (author_id) REFERENCES author(id)
)
'''
3、一对一
class Author(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
age = models.IntegerField()
# 一对一,表名加引号从全局找,不加引号受建表顺序影响。
authordetail = models.OneToOneField(to="AuthorDetail", to_field="nid", on_delete=models.CASCADE)
4、数据库迁移
python manage.py makemigrations
python manage.py migrate
- 表的名称myapp_modelName
- 外键字段,Django 会在字段名上添加"_id" 来创建数据库中的列名
- 外键字段