脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - Django如何创建应用和定义数据表详解

Django如何创建应用和定义数据表详解

2023-06-25 10:36以山河作礼。 Python

Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。

1. Django创建应用

  • Django 项目就是基于 Django 框架开发的 Web 应用,它包含了一组配置和多个应用,我们把应用称之为App,在前文中对它也做了相应的介绍,比如 auth、admin,它们都属于 APP。
  • 一个 App 就是一个 Python 包,通常一个 App 可以包含模型、视图、模板和 URL 配置文件,可以被应用到多个 Django项目中,因为它们的本质就是可被重用的 Python 软件包。

1.1 创建应用

Django 的设计目标是让开发者关注应用的功能逻辑的实现。

所以,创建应用的过程是非常简单的,利用 manage.py 提供的 startapp 命令就可以创建一个APP。

具体命令如下所示:

语法:

python manage.py startapp 应用名

python manage.py startapp index
  • startapp 同样也属于 manage.py 的子命令,用来创建 Django 的应用。

执行这个命令不会在命令行看到任何输出,但是可以在 manage.py 的同级目录下看到多出了一个 index 目录:

Django如何创建应用和定义数据表详解

我们对这些文件做逐一的解释:

  • admin.py 用于将 Model 定义的数据表注册到管理后台,是 Django Admin 应用的配置文件
  • apps.py 用于应用程序本身的属性配置文件
  • models.py 用于定义应用中所需要的数据表
  • tests.py 文件用于编写当前应用程序的单元测试
  • views.py 用来定义视图处理函数的文件
  • 一级目录下的 __init__.py文件标识 index 应用是一个 Python 包
  • migrations 目录用于存储数据库迁移时生成的文件,该目录下的 __init__.py文件标识 migrations 是一个 Python 包

这就是 index

应用涉及到的所有文件,当然在实际的开发工作中,该应用目录下的文件也不是一成不变的,开发者根据自己的需要会相应的增加文件或者子目录,比如

urls.py 文件或者存储静态文件的 static 目录等。所以大家千万不要认为 Django

框架自动生成的目录,无需我们做其他操作或者更改,这是使用 Django 的一个误区。

1.2 应用的添加

应用创建完成后,我们还需要在 settings.py 配置文件中对其进行添加。

我们已经对 INSTALLED_APPS 做了介绍,把我们创建的应用添加到这个列表,如下所示:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'index',
]
  • 用如上方式添加完成后,就可以让 index 应用的和整个项目融为一体了。
  • 接下来,就可以正式进入开发应用阶段了,通过实现一些小的功能点,让我们更加全面的了解 Django 框架。

2. Django ORM

  • ORM (Object Realtional Mapping)即对象关系映射,它是一种基于关系型数据库的程序技术。ORM允许你使用类和对象对数据库进行操作,这大大提高了对数据库的控制,避免了直接使用 SQL语句对数据库进行操作。这种程序技术的底层主要是通过映射机制实现的,后面会讲解映射的使用!
  • Web 开发中对数据库的操作是必不可少的,然而每种数据库的操作方式以及用法不尽相同。由于 Django 中 ORM的存在,为我们操作不同种类的数据库提供了统一的方法,ORM 适配了多种常用的关系型数据库。

Django如何创建应用和定义数据表详解

2.1 定义数据表

在定义数据表之前,我们应该首先理解什么是模型类。

  • 模型类

    其实模型类本质上属于一个 Python 类,只不过在 Django 中称之为做模型类,它是由 django.db.models.Model 派生出的子类

    通过上述介绍,我们可以这样理解:Django 中模型类就相当于 ORM 模块。

  • 定义数据表

    现在有一张用户信息表 UserInfo,它有两个字段 name 和 password,可以定义如下:

    from django.db import models
    class UserInfo(models.Model):
        name = models.CharFiled(max_length=100)
        password = models.CharFiled(max_length=100)
    

通过以上代码,UserInfo 数据表就已经创建完成,我们对代码进行逐行解析:

  • 第 1 行,使用 from django.db import models 导入 models 模块

  • 第 2 行,使用 class 关键字对 UserInfo 表进行类定义,并继承了models 模块中的 Model 类

  • 第3、4 行,数据表中的字段 name 和 password 是 UserInfo 类的属性,name 和 password 字段类型都是 CharFiled,字段长度均是100。

2.2 定义项目数据表

下面我们用 ORM 定义 index 应用所需的数据表,首选找到 index 应用下的 models.py 文件。

在文件里添加如下代码:

from django.db import models


# Create your models here.


# 创建book表
class Book(models.Model):
    title = models.CharField(max_length=30, unique=True, verbose_name='书名')
    public = models.CharField(max_length=50, verbose_name='出版社')
    price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='定价')
    retail_price = models.DecimalField(max_digits=7, decimal_places=2, verbose_name='零售价', default="30")


# 创建作者表
class Author(models.Model):  
    name = models.CharField(max_length=30, verbose_name='姓名')
    email = models.EmailField(verbose_name='邮箱')


# 创建用户信息表
class UserInfo(models.Model): 
    username = models.CharField(max_length=24, verbose_name='用户注册')
    password = models.CharField(max_length=24, verbose_name='密码')
  • 通过上述代码,我们定义了一个名叫 Book 的数据表。
  • 数据表由以下字段构成书名(title)、出版社(public)、价格(price)、零售价(retail_price),而且对每个字段都做添加了相应的字段属性以及字段选项。

为什么表中没有设置主键呢,当定义一个模型类时,Django会自动创建一个主键字段,该字段名为id,类型为AutoField,其自增长。

也可以手动创建

id = models.AutoField(primary_key=True) # id 会自动创建,可以手动写入

2.3 通用字段选项

Model 中添加的字段都是 Field 类型的实例,不同的 Field 类型可能会支持不同的字段选项,但是也有很多字段选项是通用的,即可以用在任何一种 Field 类型中。这里介绍一些常用且重要的通用字段选项,它们都有对应的默认值,这些字段选项都是可选的,理解这些有助于更好地使用它们。

  • blank

    默认值是 False,设置为 True 时,字段可以为空。设置为 False 时,字段是必须填写的。如果是字符型字段 CharField 和 TextField,它们是用空字符串来存储空值的。

  • unique

    默认值是 False,它是一个数据库级别的选项,规定该字段在表中必须是唯一的。

  • null

    默认为 False,如果此选项为 False 建议加入 default 选项来设置默认值。如果设置为 True,表示该列值允许为空。日期型、时间型以及数字型字段不接受空字符串。所以当设置 IntegerField,DateTimeField 型字段可以为空时,需要将 blank 与 null 均设为 True 才可以。

  • `db_index

    默认值是 False,如果设置为 True,Django 则会为该字段创建数据库索引,如果该字段经常作为查询的条件,那么就需要设置 db_index 选项,从而加快数据的检索速度。

  • db_column

    这个选项用于设置数据库表字段的名称。如果没有指定,Django 默认使用 Model 中字段的名字。

  • default

    用于给字段设置默认值,该选项可以设置为一个值或者是可以调用对象,但不能是可变对象,不同字段类型默认值也不同,比如 BooleanFiled 布尔类型 default 值为Ture 或者 False。主要的使用场景是当一个字段的值被用户省略时,后台服务器自动为该字段的设置默认值。

  • primary_key

    默认值是 False,如果设置为 True,表示该字段为主键,在 Django 中 默认 id 为主键,也就是说即使你的数据表中没有创建 id 字段,Django 也会自动为你创建 id 字段并将其设置为主键。如果你在表中设置了其他字段为主键的时,那么 Django 将取消为 id 字段设置主键。

  • choices

    这个选项用于给字段设置可以选择的值。它是一个可迭代对象,即列表或者元组,其中每一个元素都是一个二元组(a,b)的形式,a 是用来选择的对象,b 是对 a 的描述信息。比如我们对某个人性别定义数据表如下所示:

    # 创建表
    class UserInfo(models.Model):
        # 定义chocies参数的对应关系,以元组(或者列表)的形式进行表述:
        choices = (
            (male, '男性'),
            (female, '女性'),
        )
        gender = models.CharField(max_length=2,choices = choices,default='male')
    
  • verbose_name

    设置此字段在 admin 后台管理系统界面上的显示名称,如果没有设置这个字段,Django 将会直接展示字段名并且将字段中的下划线转变为空格

2.4 外键使用

有一个数据表,就应该对应一个模型 在models.py中定义模型

引入:from django.db import models

模型类要继承models.Model类

from django.db import models

# Create your models here.
class Grades(models.Model):
    """班级表"""
    gname = models.CharField(max_length=20)  # 班级名称
    gdate = models.DateTimeField()  # date
    gtotal = models.IntegerField()  # total

class Students(models.Model):
    """学生表"""
    sname = models.CharField(max_length=20)  # name
    sgender = models.BooleanField(default=True)  # gender
    sage = models.IntegerField()  # age
    # 关联外键
    sgrade = models.ForeignKey(Grades,models.DO_NOTHING)
on_delete=None,  # 删除关联表中的数据时,当前表与其关联的field的行为

on_delete=models.CASCADE,     # 删除关联数据,与之关联也删除

on_delete=models.DO_NOTHING,  # 删除关联数据,什么也不做

on_delete=models.PROTECT,     # 删除关联数据,引发错误ProtectedError

\# models.ForeignKey('关联表', on_delete=models.SET_NULL, blank=True, null=True)
on_delete=models.SET_NULL,  # 删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理)

\# models.ForeignKey('关联表', on_delete=models.SET_DEFAULT, default='默认值')
on_delete=models.SET_DEFAULT, # 删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理)

2.5 应用数据库迁移

上面我们创建好了 index应用所需的数据表,下一步就是执行数据库的迁移,之后让我们再来看一下又有什么新的变化发生呢?数据库迁移的两个命令分步骤执行,

如下所示:

$ python manage.py makemigrations
$ python manage.py migrate

执行完毕后会在命令行得到如下输出:

Django如何创建应用和定义数据表详解

Django如何创建应用和定义数据表详解

若迁移过程中出现报错提示,首先检查您的 models.py 文件是否正确书写,除此之外,也可能由于 Django 与 MySQL 版本问题导致报错。

  • 从上述输出结果可以看出,我们对 index 应用进行了数据库迁移工作。
  • 并且在数据库中创建了三张表,分别是 Author、Book、UserInfo。

而且在 index 应用下的 migrations 目录下生还成了一个 0001_initial.py 的文件:

Django如何创建应用和定义数据表详解

这个迁移文件包含了创建数据表时用到的所有信息,这是一个临时的过度文件。

makemigrationsmigrate 是 Django 中的两个命令,用于数据库迁移和同步模型。

makemigrations 命令会基于你的 Django应用中的模型定义,生成一组迁移文件,这些文件描述如何在数据库中创建或修改表结构。在执行 makemigrations命令时,Django 会比较当前模型定义与最近一次迁移所定义的模型之间的差异,并生成一系列 SQL 命令来执行这些更改。

示例命令:

$ python manage.py makemigrations

migrate 命令用于应用迁移,它会将迁移文件中定义的更改应用到数据库中。执行 migrate 命令时,Django会检查其中的每个迁移,执行其中定义的 SQL 命令,并将这些更改反映到数据库模式中。如果执行成功,你的 Django应用的数据模型就和数据库之间保持同步了。

示例命令:

$ python manage.py migrate

总之,makemigrations 命令会生成迁移文件,描述如何在数据库中创建或修改表结构,而 migrate命令会将这些迁移文件应用到数据库中,使数据模型保持和数据库之间的同步。这两个命令通常会在 Django开发过程中被频繁使用,需要对数据库进行修改,增加和删除操作。

到此这篇关于Django如何创建应用和定义数据表详解的文章就介绍到这了,更多相关内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/weixin_50804299/article/details/131138876

延伸 · 阅读

精彩推荐
  • Pythonpython编程开发之日期操作实例分析

    python编程开发之日期操作实例分析

    这篇文章主要介绍了python编程开发之日期操作,以实例形式较为详细的分析了Python中datetime与time库的相关使用技巧,具有一定参考借鉴价值,需要的朋友可以参...

    Hongten4522020-08-03
  • Python对PyQt5中的菜单栏和工具栏实例详解

    对PyQt5中的菜单栏和工具栏实例详解

    今天小编就为大家分享一篇对PyQt5中的菜单栏和工具栏实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    天堂122310172021-07-17
  • PythonPyTorch读取Cifar数据集并显示图片的实例讲解

    PyTorch读取Cifar数据集并显示图片的实例讲解

    今天小编就为大家分享一篇PyTorch读取Cifar数据集并显示图片的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...

    Elijha6732021-03-22
  • Pythonpycharm查看变量值的4种方法汇总

    pycharm查看变量值的4种方法汇总

    因为Python是脚本语言,不会进行编译,所以只有执行到那一行,才能知道那个变量的类型,下面这篇文章主要给大家介绍了关于pycharm查看变量值的4种方法,需要的...

    Dust_Evc5592022-12-09
  • PythonPython实现图片拼接的代码

    Python实现图片拼接的代码

    本文通过实例代码给大家介绍了python实现图片拼接的方法,非常不错,具有一定的参考借鉴借鉴价值,需要的朋友参考下吧...

    LemonTree_Summer10582021-03-12
  • Python详解如何创建Python元类

    详解如何创建Python元类

    通过本文,将深入讨论Python元类,其属性,如何以及何时在Python中使用元类。...

    华为云开发者社区3572021-11-09
  • PythonPython爬虫学习之翻译小程序

    Python爬虫学习之翻译小程序

    这篇文章主要为大家详细介绍了Python爬虫学习之翻译小程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    罗思洋7202021-09-07
  • Pythonpython中itertools模块使用小结

    python中itertools模块使用小结

    itertools 是python的迭代器模块,itertools提供的生成迭代器的函数,相当高效且节省内存。使用这些工具,你将能够创建自己定制的迭代器用于高效率的循环。...

    嗨,阿良4812022-02-24