Django小知识-Models 数据库操作

Django知识点

Posted by Carlos on October 16, 2022

Django中Models 数据库操作-创建model

在Django中,Model是应用程序的数据存储和业务逻辑的核心,用于定义如何管理数据,以及如何与数据进行交互和修改。使用Model可以轻松地创建数据库表以及对其进行操作,极大地提升了应用程序的开发效率和可维护性。本文将介绍如何在Django中创建Model,并对其进行常见操作。

准备工作

1.在settings 文件中,INSTALLED_APPS 添加App“SFT”。 Django 在启动时会自动加载 ‘SFT’ 应用,使其成为可用的应用程序,可以在项目中使用这个自定义应用的模型、视图和其他组件。

1
2
3
4
5
6
7
8
9
10
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    # 添加 
    'SFT',
]

2.在settings 文件中,DATABASES 支持的数据库后端有多种,如MySQL、PostgreSQL、SQLite等,可以根据不同的需求进行选择。其中,每个数据库后端需要安装对应的驱动程序才能正常使用,如使用MySQL时需要安装mysqlclientpymysql等驱动程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 连接本地SQLite 数据库
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

# 连接mysql 数据库
DATABASES = {
     'default': {
         'ENGINE': 'django.db.backends.mysql',
         'NAME': 'user_manage', #db名称
         'USER': 'root',
         'PASSWORD': '123456',
         'HOST': '127.0.0.1',
         'PORT': '3306',
     }
 }  

创建Model

在Django中,models.py文件用于定义数据表的结构和字段属性。下面是列出所有定义数据表的结构和字段属性的用法

导入模块

1
from django.db import models

创建模型

1
2
3
4
5
6
class City(models.Model):
    name = models.CharField(max_length=50, verbose_name='城市名称')
    code = models.CharField(max_length=20, verbose_name='城市编码')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建日期')
    description = models.TextField(null=True, blank=True, verbose_name='城市描述')
    image = models.ImageField(upload_to='city_images/', null=True, blank=True, verbose_name='城市图片')

定义模型属性

上面的代码中,我们定义了一个名为City的模型类,它继承自models.Model。这个模型类有四个属性,分别name、code、created_at、description、image。

定义字段类型

  • CharField:用于存储字符串类型的数据,对应数据库中的VARCHAR类型。在创建时需要指定最大长度。
  • DateField:用于存储日期类型的数据,对应数据库中的DATE类型。
  • DecimalField:用于存储精确到小数点后若干位的数字类型的数据,对应数据库中的DECIMAL类型。在创建时需要指定数字的总位数和小数位数。
  • IntegerField:用于存储整数类型的数据,对应数据库中的INT或BIGINT类型。
  • BooleanField:布尔值对应数据中的BOOLE类型
  • FileField : 用于存储文件相关数据,对应数据库中的FILE类型

还有其他许多字段类型可供选择,如TextFieldBooleanFieldForeignKeyManyToManyField等。

定义字段属性

  1. unique

该选项用于设置字段是否唯一。如果设置为True,则该字段的值在整个表中必须是唯一的。

1
2
class MyModel(models.Model):
    my_field = models.CharField(max_length=50, unique=True)
  1. max_length

该选项用于限制字符串类型字段的最大长度。

1
2
class MyModel(models.Model):
    my_field = models.CharField(max_length=50)
  1. default

该选项用于设置字段的默认值。

1
2
class MyModel(models.Model):
    my_field = models.CharField(max_length=50, default='default value')
  1. null

该选项用于设置字段是否为NULL。如果设置为True,则允许该字段的值为空值。

1
2
class MyModel(models.Model):
    my_field = models.CharField(max_length=50, null=True)
  1. blank

该选项用于设置字段是否可以为空字符串。如果设置为True,则该字段的值可以为空字符串。

1
2
class MyModel(models.Model):
    my_field = models.CharField(max_length=50, blank=True)
  1. choices

该选项用于设置枚举类型的字段。可以设置一个二元组列表,其中每个二元组包含两个值,分别是值和显示值。

1
2
3
4
5
6
7
class MyModel(models.Model):
    COLOR_CHOICES = [
        ('red', 'Red'),
        ('green', 'Green'),
        ('blue', 'Blue'),
    ]
    color = models.CharField(max_length=10, choices=COLOR_CHOICES)
  1. min_valuemax_value

这两个选项用于限制整数类型字段的取值范围,分别表示最小值和最大值。

1
2
class MyModel(models.Model):
    my_field = models.IntegerField(min_value=0, max_value=100)
  1. auto_nowauto_now_add

这两个选项用于设置 时间类型 字段的自动更新。auto_now 用于记录每次修改的时间,auto_now_add 用于记录创建的时间。

1
2
3
class MyModel(models.Model):
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
  1. decimal_placesmax_digits

这两个选项用于设置浮点数类型字段的精度,分别表示小数位数和数字总位数。

1
2
class MyModel(models.Model):
    price = models.DecimalField(max_digits=10, decimal_places=2)

除了定义属性,我们还可以在模型中定义方法。例如:

1
2
3
4
5
6
7
8
9
class City(models.Model):
    name = models.CharField(max_length=50, verbose_name='城市名称')
    code = models.CharField(max_length=20, verbose_name='城市编码')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='创建日期')
    description = models.TextField(null=True, blank=True, verbose_name='城市描述')
    image = models.ImageField(upload_to='city_images/', null=True, blank=True, verbose_name='城市图片')

    def __str__(self):
        return self.city

上述代码中,我们定义了一个__str__方法,当我们在Python交互环境中输出该模型实例时,它将返回书籍的名称。

以上便是在Django中定义数据表的结构和字段属性的基本用法。通过这种方式,我们可以轻松地创建数据库表并操作其中的数据。

生成数据库表

在新建或修改完Model之后,需要通过Django的迁移工具来同步数据库表。迁移是Django自带的一个管理数据库模式变化的工具,它可以记录每次对模型的更改,然后根据这些更改生成相应的SQL语句,最终同步到数据库中。

首先需要运行以下命令来创建迁移文件:

1
python3 manage.py makemigrations (your_app_name)

其中,your_app_name是你的应用程序的名称。执行上述命令后,Django会扫描your_app_name目录下的所有模型,不填写your_app_name则扫描所有app下目录的模型,并检测模型的变化情况,然后生成一个包含这些变化的迁移文件。接下来,需要再执行以下命令来将迁移文件同步到数据库中:

1
python3 manage.py migrate

运行以上命令后,Django就会根据迁移文件来创建或修改数据库表结构。