Django中ORM创建表关系

一:django中ORM创建表关系

  • ORM创建外键关系
1.表与表之间的关系
1.表与表之间的关系
一对多
一对一
多对多

2.操作目标条件:

图书表

出版社表

作者表

作者详情表

3.外键关联
一对多:
图书和出版社是一对多的关系 外键字段建在多的那一方 book
多对多:
图书和作者是多对多的关系 需要创建第三张表来专门存储
一对一:
作者与作者详情表是一对一

4.表关系的判断
换位思考
ORM针对外键字段的创建位置
1.不常用的数据我们称之为冷数据
2.常用的数据我们称之为热数据

一对多: 外键创建在多的一方
一对一: 建在任何一方都可以 但是推荐建在查询频率较高的表中
多对多: orm自动帮你创建第三张关联表
2.ORM中如何定义三种关系
1.一对多

(图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
# 默认就是与出版社表的主键字段做外键关联
publish = models.ForeignKey(to='Publish')

如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
后面在定义Foreignkey的时候就不要自己加_id


2.多对多

# 自动帮你创建书籍和作者的第三张表
authors = models.ManyToManyField(to='Author')

authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
让orm自动帮你创建第三张关系表


3.一对一

# 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
author_detail = models.OneToOneField(to='AuthorDetail')

OneToOneField也会自动给字段加_id后缀
所有不要自作聪明 自己加后缀_id


# 会自动在字段后面加_id后缀
ForeignKey
OneToOneField
3.ORM创建表关系models.py文件
from django.db import models

# 图书表
class Book(models.Model):
    # title varchar(32)
    title = models.CharField(max_length=32)
    # 总共八位 小数点后面占两位 9价格)
    print = models.DecimalField(max_digits=8,decimal_places=2)
    
    # (图书和出版社是一对多) 并且书是多的一方 所有外键字段放在书表里面
    # 默认就是与出版社表的主键字段做外键关联
    publish = models.ForeignKey(to='Publish')
    """
    如果字段对应的是Foreignkey 那么会orm会自动子啊字段的后面加_id
    如果自己自作聪明的加了id 那么orm还是会在后面继续加_id
    
    后面在定义Foreignkey的时候就不要自己加_id
    """
    # # 自动帮你创建书籍和作者的第三张表
    authors = models.ManyToManyField(to='Author')
    # authors是一个虚拟字段 主要是用来告诉orm 书籍表和作者表是多对多关系
    # 让orm自动帮你创建第三张关系表

# 出版社表
class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

# 作者表
class Author(models.Model):
    name = models.CharField(max_length=32)
    age = models.IntegerField()
    # 作者与作者详细是一对一的关系 外键建在查询频率较高的表中
    author_detail = models.OneToOneField(to='AuthorDetail')
    """
    OneToOneField也会自动给字段加_id后缀
    所有不要自作聪明 自己加后缀_id
    """

# 作者详细信息表
class AuthorDetail(models.Model):
    # phone 电话
    phone = models.BigIntegerField()  # 或者直接字符类型
    # addr 地址
    addr = models.CharField(max_length=32)
4.在settings.py配置文件修改配置
  • mysql提前创建好库
1.在settings.py配置文件修改配置
"""django默认使用自带的sqlite3"""
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'day60',  # 数据库名称 一定要事先创建好才能指定
        'HOST':'127.0.0.1', # 数据库IP,暂用本地回环地址
        'PORT':3306,     # 数据库端口
        'USER':'root',   # 数据库用户名
        'PASSWORD':'123', # 数据库密码
        'CHARSET':'utf8'  # 指定字符编码
    }
}	
5.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
2.在项目文件夹或者应用文件夹内的__init__.py文件中书写固定的代码
import pymysql
pymysql.install_as_MySQLdb()

在django1.X版本中外键默认都是级联更新删除的

image

posted @ 2022-02-25 14:15  AlexEvans  阅读(134)  评论(0编辑  收藏  举报