目录
模型定义与数据迁移
模型定义
ORM 框架是一种程序技术,用于实现面向对面变成语言中不同类型系统的数据之间的转换。
# index\model.py
from django.db import models
# Create your models here.
class PersonInfo(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=20)
age = models.IntegerField()
hireDate = models.DateField()
def __str__(self):
return self.name
class Meta:
verbose_name = '人员信息'
在定义模型时,一般情况下都会重写函数__str__,这是设置模型的返回值,默认情况下,返回值为模型名+主键,只允许返回字符串类型
模型除了定义模型字段和重写函数__str__之外,还有Meta选项,这三者是定义模型的基本要素、Meta 选项里设有19个属性,每个属性的说明如下:
- abstract:若为True, 则该模型为抽象模型,不会在数据库里创建数据表
- app_label: 属性值为字符串,将模型设定为指定的项目应用,比如将index 的 moudles.py 定义的模型A 指定到其他APP里
- db_table: 属性值为字符串,设置模型所对应的数据表的名称
- db_tablespace: 属性值为字符串,设置模型所使用数据库的表空间
- get_latest_by: 属性值为字符串或列表,设置模型数据的排序方式。
数据迁移
数据迁移是将项目里定义的模型生成相应的表数据,包括数据表的创建和更新。
创建数据表:
# index\models.py
class Vocation(models.Model):
id = models.AutoField(primary_key=True)
job = models.CharField(max_length=20)
title = models.CharField(max_length=20)
name = models.ForeignKey(PersonInfo,on_delete=models.Case)
def __str__(self):
return str(self.id)
class Meata:
verbose_name = '职业信息'
- 执行 python manage.py makemigrations 后会生成以下文件:
import django.db.models.expressions
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('index', '0002_alter_personinfo_options_personinfo_hiredate'),
]
operations = [
migrations.CreateModel(
name='Vocation',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('job', models.CharField(max_length=20)),
('title', models.CharField(max_length=20)),
('name', models.ForeignKey(on_delete=django.db.models.expressions.Case, to='index.personinfo')),
],
),
]
该脚本的代码会被migrate 命令执行,migrate 指令会根据脚本代码的内容在数据库里创建相应的数据表
- 执行 python manage.py migrate 即可生成数据库表
更新表结构操作:
makemigrations 和 migrate 指令还支持模型的修改,从而修改相应的数据表结构,比如在模型Vocation 里新增字段 payment,代码如下:
class Vocation(models.Model):
id = models.AutoField(primary_key=True)
job = models.CharField(max_length=20)
title = models.CharField(max_length=20)
payment = models.IntegerField(null=True,blank=True) # 新增字段
name = models.ForeignKey(PersonInfo,on_delete =models.Case)
def __str__(self):
return str(self.id)
class Meata:
verbose_name = '职业信息'
新增字段必须将属性 null 和 blank 设置为 True 或者为模型字段设置默认值,否则执行 makemigration 指令会提示信息:
(venv) PS E:\PyProject\MyDjango> python manage.py makemigrations
It is impossible to add a non-nullable field 'payment' to vocation without specifying a default. This is because the database needs something to populate existing rows.
Please select a fix:
1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
2) Quit and manually define a default value in models.py.
每次执行migrate 执行时,Django 都能精准运行 migrations 文件夹尚未办被执行的.py 文件,它不会对同一个.py 文件重复执行,因为每次执行时,Django 会将 该文件的执行记录保存在数据表django_migrations 中,数据表的数据信息如下:
如果需要重复执行 migrations 文件夹的某个.py文件,就只需要在数据表里删除相应文件执行记录。一般情况下不建议采用这种操作,因为很容易出现异常。比如表在已存在的情况下,再次执行相应的.py文件,会提示"table 'xxx' alread exites" 异常
migrate 指令还可以单独执行某个文件例如:python manage.py migrate index 0001_initial
此外Django 提供了sqlmigate指令, 可以根据 migrate下的 .py 文件生成相应的sql 语句:
(venv) PS E:\PyProject\MyDjango> python manage.py sqlmigrate index 0003_vocation
--
-- Create model Vocation
--
CREATE TABLE `index_vocation` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `job` varchar(20) NOT NULL, `title` varchar(20) NOT NULL, `name_id` integer NOT NULL);
ALTER TABLE `index_vocation` ADD CONSTRAINT `index_vocation_name_id_a21d19c0_fk_index_personinfo_id` FOREIGN KEY (`name_id`) REFERENCES `index_personinfo` (`id`);
标签:index,name,models,数据库,py,Django,id,模型
From: https://www.cnblogs.com/czzz/p/18172695