首页 > 数据库 >Django - 模型与数据库

Django - 模型与数据库

时间:2024-05-04 21:12:41浏览次数:30  
标签:index name models 数据库 py Django id 模型

目录

模型定义与数据迁移

模型定义

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 = '职业信息'
  1. 执行 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 指令会根据脚本代码的内容在数据库里创建相应的数据表

  1. 执行 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

相关文章

  • WDS+MDT网络启动自动部署windows(十三)骚操作,修改MDT数据库,使用变量设置计算机描述
    简介我正在努力尝试将一个被取消的功能重新实现。在mdt安装时,为计算机添加计算机描述,它将是未来一些自动化操作的变量,如使用人参数。MDT2010-SettingtheComputerDescriptioninADwithoutawebservice-DeployVista在MDT部署期间在ActiveDirectory中设置计算机......
  • 深入学习和理解Django视图层:处理请求与响应
    title:深入学习和理解Django视图层:处理请求与响应date:2024/5/417:47:55updated:2024/5/417:47:55categories:后端开发tags:Django请求处理响应生成模板渲染表单处理中间件异常处理第一章:Django框架概述1.1什么是Django?Django是一个高级的PythonWeb......
  • 【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台
    1.项目介绍  基于.NETFramework4.8开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系列下的Det、Seg、Pose、Obb、Cls等应用场景,同时支持图像与视频检测。模型部署引擎使用的是OpenVINO™、TensorRT、ONNXruntime以及OpenCVDNN,支持CP......
  • 配置session——数据库
    INSTALLED_APPS=[......'django.contrib.sessions',......]MIDDLEWARE=[......'django.middleware.common.CommonMiddleware',......]#sessionSESSION_ENGINE='django.contrib.sessions.backends.......
  • 拂衣天气(微天气)-模型设计
    前言这是一个前后端分离的项目,后端使用Java进行开发,而前端通过微信小程序实现。功能结构可从上图得知,部分功能已去除:消息消息推送紧急情况推送用户个人中心模型设计用户信息(UserInfo)idLong主键oidStringOpenIDuidStringUnionIDnameString昵称pho......
  • linux实验(数据库备份)
    linux实验(数据库备份)以下所有操作皆以机房电脑上的虚拟机为基础环境下载链接:Linux课程机房虚拟机#切换到root用户su-root安装数据库mysql5.7rpm-ivhhttps://mirrors4.tuna.tsinghua.edu.cn/mysql/yum/mysql-5.7-community-el7-x86_64/mysql-community-common-5.7.......
  • MySQL 数据库自增主键生成的优缺点
    MySQL数据库中使用自增主键(AUTO_INCREMENT)作为表的主键有以下显著的优点和缺点:**优点**:1.**简化开发**:开发人员不需要手动指定每条记录的唯一标识,减少了出错的可能性。2.**性能优化**:自增主键通常会导致数据在物理存储上近乎顺序地排列,这能够提升基于主键的查询效率,特别......
  • Django - 探究CBV视图
    目录数据显示视图基础视图TemplateView数据显示视图基础视图TemplateView视图类TemplateView是所有视图类里最基础的应用视图类,开发者可以直接调用应用视图类,它继承多个父类classTemplateView(TemplateResponseMixin,ContextMixin,View):"""Renderatemplate......
  • 易优CMS安装出现程序和数据库版本不一致情况的解决方法
    易优cms建站系统出现无法安装,数据库文件版本号(V1.5.4)与CMS源码版本号(V1.5.6)不一致怎么办?这样的情况是因为程序在安装的时候是低版本,安装过通过后台升级到了最新版本。然后再进行数据库和程序的备份,就会导致程序和数据库版本不一致的情况。接下来我们给大家说下怎么来解决这个......
  • 大模型_2:Prompt Engineering
    目录:1、提示工程简介2、如何写好提示词2.1 描述清晰2.2 角色扮演2.3 提供示例2.4 复杂任务分解2.5 使用格式符区分语义2.6 情感和物质激励2.7 使用英语2.8 结构化提示词1、提示工程简介1.1什么是Prompt提示词?不论是文生图应用,还是GPT文生文的应用,......