mysql 一对多 关联一条最新的数据_Django多表操作之模型创建,数据库迁移

740e142e89ac029a3bd589472b8c44f0.png

Ⅰ 需要创建的表

    • Book -- 图书表
    • Publish -- 出版社
    • Author -- 作者表
    • AuthorDatail -- 作者详情表
  • 表关系
    • 作者和作者详情是一对一关系,关联字段写在哪里都可以
    • 图书和出版社是一对多关系,一对多关系一旦确立,关联字段写在多的一方
    • 图书和作者是多对多关系,多对多的关系需要建立第三张表(Django的ORM中可以自动生成)
  • models.py文件
# 多表模型创建

class Book(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=6,decimal_places=2)
    publish_date = models.DateTimeField(auto_now_add=True)
    publish = models.ForeignKey(to='Publish') # 不写,默认关联主键

    # 自动创建出第三张表
    # authors 在数据库中不存在改字段
    # 默认情况:第三张表有自身的id字段,和当前表的id字段及Author表的id字段,不能新增字段
    authors = models.ManyToManyField(to='Author')

class Publish(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=128)
    phone = models.CharField(max_length=64)
    email = models.EmailField()

class Author(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.SmallIntegerField()
    author_detail = models.OneToOneField(to='AuthorDatail')

class AuthorDatail(models.Model):
    id = models.AutoField(primary_key=True)
    res = (('1','男'),('2','女'),('0','保密'),)
    sex = models.SmallIntegerField(choices=res)
    addr = models.CharField(max_length=64)
    phone = models.BigIntegerField()

Ⅱ 迁移到mysql数据库中

  • 配置文件
    • settings.py文件
DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),   # 原配置

    'default':{
        'ENGINE':'django.db.backends.sqlite3',
        'NAME':'book',
        'USER':'toot',
        'PASSWORD':'123456',
        'HOST':'127.0.0.1',
        'PORT':3306  }}   # 新配置属性,Django的ORM不能创建数据库,我们需要手动创建一个库,
  • 新建数据库 -- 若使用原有库,里面不能有表,否则无法迁移
    • 提前在mysql中建立数据库:book 同上方配置文件name对应
    • 在app01/__init__.py文件
import pymysql

pymysql.install_as_MySQLdb()
  • pycharm/Tools/Run manage.py Task
    • 两条命令
    • makemigrations
    • migrate
  • Navicat中查看表结构

f7f4513fd77d823e351449e21ab53086.png

外键关系要不要建立

  • 关联字段与外键约束没有必然的联系(建管理字段是为了进行查询,建约束是为了不出现脏数据)
  • 默认情况,关联关系建好以后,外键约束就自然建立了
  • 实际工作中,外键约束一般不建(影响效率),都是人为约束(代码约束)
  • -db_constraint=False
  • 表模型和数据库表的对应,不要直接修改表(这是可以的,但是不建议),要修改表模型,同步到表中
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值