Django模型层Model基础:建表、查询与删除实战指南
本文详解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/")
总结
以上就是本文的全部内容,希望本文的内容对大家的学习或工作具有一定的参考价值。如有疑问欢迎留言交流,感谢支持。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









