Django模型层Model基础:建表、查询与删除实战指南

Oliver
Oliver
发布时间:2026-10-13| 3人浏览过
原创

本文详解Django框架中Model层的核心用法,涵盖基于MTV架构的ORM建表流程、常用字段参数配置、数据库迁移命令及MySQL配置方法。通过实例演示如何利用Model类完成数据表的创建、记录的查询与删除操作,帮助开发者高效管理数据库交互。

前言

Django框架在设计上遵循MTV模式,即Model(模型)、Template(模板)和Viewer(视图,在Django中通常指View)。

与传统三层架构或MVC框架中的数据处理层类似,Model主要负责与数据库进行交互。Django默认采用ORM(对象关系映射)框架中的Code First模式,这意味着开发者只需专注于Python代码的编写,无需过多关心底层数据库的具体实现,从而将开发人员从繁琐的数据库操作中解放出来。

Django会根据定义的Model类生成一个数据库镜像文件(迁移文件),随后利用该文件创建实际的数据库表。同时,该文件会记录与数据库同步的版本信息。因此,在使用Django开发时,严禁手动直接修改数据库结构,否则会导致Django的版本记录与实际数据库状态不一致,进而造成数据模型与数据库内容无法正确同步的问题。

Django生成的镜像文件示例如下:

from __future__ import unicode_literals

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('web', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='userinfo',
name='sex',
field=models.BooleanField(default=True),
preserve_default=False,
),
]

上述内容展示了一个版本的镜像文件,其中记录了对应App中Model的操作历史。例如,该文件记录了在web App的Model中增加了一个名为sex的字段,其类型为Boolean,默认值为True。

在一个项目中,最核心的部分无疑是数据,即数据库。接下来的内容将引导大家深入理解Django中Model层的使用。Model的主要功能是在不使用SQL语句的情况下,通过Python代码完成数据库的增、删、改、查操作。

本篇教程将重点介绍如何简单地创建数据表、执行查询以及删除数据。以下是详细的介绍内容。

一、ORM(对象关系映射)

ORM建立了以下映射关系:

数据库表名 <-------> Python类名

数据库字段 <-------> 类属性

数据库记录 <-------> 类实例对象

二、创建数据表(建立模型)

1、创建表的代码应编写在项目目录下的models.py文件中。

1)例如,我们要创建一个图书表,代码结构如下:

from django.db import models

# Create your models here.

class Book(models.Model):
 nid = models.AutoField(primary_key=True) #AutoField有序整形 IntegerField整形
 title = models.CharField(max_length=32) #CharField字符
 author = models.CharField(max_length=32)
 publishDate = models.DateField() #DateField日期类型
 price = models.DecimalField(max_digits=5, decimal_places=2) #DecimalField浮点型也可以用FloatField

类名对应数据库中的表名,类的属性对应数据库中的字段。必须继承Django提供的用于转换的models.Model,这样才能将我们定义的Python类转化为数据库表结构。

定义好模型后,你需要告知Django使用这些模型。这需要通过修改项目的配置文件来实现。

2)字段常用参数说明

(1)null

如果设置为True,Django将在数据库中存储NULL值来表示空值。默认值为False。

(1)blank

如果设置为True,该字段在前端表单中允许为空。默认值为False。

需要注意的是,null与blank不同。null纯粹是数据库层面的概念,而blank属于数据验证层面的概念。

如果一个字段的blank=True,表单验证将允许该字段为空值。如果字段的blank=False,则该字段为必填项。

(2)default

指定字段的默认值。可以是一个具体的值,也可以是一个可调用对象。如果是可调用对象,每次创建新对象时都会调用该函数。

(3)primary_key

如果设置为True,则该字段成为模型的主键。如果你未指定任何字段的primary_key=True,Django会自动添加一个IntegerField类型的主键。因此,除非你想覆盖默认的主键行为,否则无需手动设置任何字段的primary_key=True。

(4)unique

如果设置为True,则该数据字段在整张表中的值必须是唯一的。

(5)choices

由二元组组成的可迭代对象(如列表或元组),用于为字段提供选择项。如果设置了choices,默认生成的表单控件将是下拉选择框而非文本框,且选项内容来自choices定义。

以下是一个关于choices列表的示例:

YEAR_IN_SCHOOL_CHOICES = (
 ('FR', 'Freshman'),
 ('SO', 'Sophomore'),
 ('JR', 'Junior'),
 ('SR', 'Senior'),
 ('GR', 'Graduate'),
)

每个元组的第一个元素是存储在数据库中的值;第二个元素是在管理界面或ModelChoiceField中显示的内容。在给定model类的实例中,若要获取某个choices字段的显示值,需调用get_FOO_display方法(其中FOO为choices字段的名称)。

例如:

from django.db import models

class Person(models.Model):
 SHIRT_SIZES = (
  ('S', 'Small'),
  ('M', 'Medium'),
  ('L', 'Large'),
 )
 name = models.CharField(max_length=60)
 shirt_size = models.CharField(max_length=1, choices=SHIRT_SIZES)


>>> p = Person(name="Fred Flintstone", shirt_size="L")
>>> p.save()
>>> p.shirt_size
'L'
>>> p.get_shirt_size_display()
'Large'

2、修改配置文件settings.py

1)Django默认使用SQLite3数据库,若我们要使用MySQL数据库,则需要修改相关配置。

原始配置(需将这些配置注释掉):

DATABASES = {
 'default': {
  'ENGINE': 'django.db.backends.sqlite3',
  'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
 }
}

重新配置后的内容如下:

DATABASES = {

 'default': {
   
  'ENGINE': 'django.db.backends.mysql',

  'NAME': 'blog', #你的数据库名称 数据库需要自己提前建好

  'USER': 'root', #你的数据库用户名

  'PASSWORD': '', #你的数据库密码

  'HOST': '', #你的数据库主机,留空默认为localhost

  'PORT': '3306', #你的数据库端口

 }
}

3、创建表的命令操作

1)同步更改数据库表或字段结构。

老版本命令:

python manage.py syncdb

Django 1.7.1及以上版本需使用以下命令:

python manage.py makemigrations
python manage.py migrate

2)运行python manage.py makemigrations后,应用下的migrations文件夹中会自动生成一个文件,该文件将我们写的类进一步转化为迁移操作:

# -*- coding: utf-8 -*-
# Generated by Django 1.11.6 on 2017-10-25 03:30
from __future__ import unicode_literals

from django.db import migrations, models

class Migration(migrations.Migration):

 initial = True

 dependencies = [
 ]

 operations = [
  migrations.CreateModel(
   name='Book',
   fields=[
    ('nid', models.AutoField(primary_key=True, serialize=False)),
    ('title', models.CharField(max_length=32)),
    ('author', models.CharField(max_length=32)),
    ('publishDate', models.DateField()),
    ('price', models.DecimalField(decimal_places=2, max_digits=5)),
   ],
  ),
 ]

3)运行python manage.py migrate后,表结构将被插入到数据库中。

4)注意事项:

如果Python版本为3.x,运行上述两条命令可能会报错。

No module named "MySQLdb"

在Python 3.x环境中,数据库连接使用的是pymysql模块,因此需要告知Django使用pymysql。

在应用目录下的__init__.py文件中添加以下代码:

import pymysql

pymysql.install_as_MySQLdb()

运行后在数据库中查看:

你会发现Django自动创建了许多表。我们自己创建的Book表会被自动命名为应用名_book(例如app01_book),这样可以避免在不同应用中存在同名表的情况。其他自动创建的表将在后续使用时逐一介绍。

三、查看数据表

1、首先在视图函数view.py中将数据取出。

from app01 import models #app01是应用名

def index(request):
 # 从数据库取出所有书籍对象
 bookList=models.Book.objects.all() # [bookObj1,.....]
 return render(request,"index.html",{"bookList":bookList})

查询相关操作:

<1> all():查询所有结果。

<2> filter():查询符合给定筛选条件的对象。

2、在Template模板中接收数据。

{% for book_obj in bookList %}
 <tr>
  <td>{{ book_obj.nid }}</td>
  <td>{{ book_obj.title }}</td>
  <td>{{ book_obj.author }}</td>
  <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  <td>{{ book_obj.price }}</td>
 </tr>
{% endfor %}

四、删除数据

删除方法是delete()。该操作在运行时立即删除对象,且不返回任何值。

例如,我们可以为表中添加一个删除按钮,实现点击按钮后删除数据库中对应记录的功能。

1、Template模板代码:

{% for book_obj in bookList %}
 <tr>
  <td>{{ book_obj.nid }}</td>
  <td>{{ book_obj.title }}</td>
  <td>{{ book_obj.author }}</td>
  <td>{{ book_obj.publishDate|date:"Y-m-d" }}</td>
  <td>{{ book_obj.price }}</td>
  <td>
   <a href="/del/{{ book_obj.nid }}"><button class="btn btn-danger">删除</button></a>
  </td>
 </tr>
{% endfor %}

2、URL分发配置:

urlpatterns = [
 url(r'^admin/', admin.site.urls),
 url(r'^index/', views.index),
 url(r'^del/(\d+)', views.delBook),
]

3、视图函数view实现删除逻辑:

def delBook(request,id):
 models.Book.objects.filter(nid=id).delete()
 return redirect("/index/")

总结

以上就是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考价值。如有疑问欢迎留言交流,感谢支持。

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。