脚本专家 发表于 2026-7-17 15:00:00

Django ORM入门:增删改查操作与模型设计实战

Django ORM(Object Relational Mapping)是Django框架的核心组件之一,它让开发者用面向对象的方式操作数据库,无需直接编写SQL语句。ORM将Python类映射为数据库表,类的属性映射为字段,类的实例映射为表中的一行记录。这种设计使得Django项目可以轻松切换数据库后端(如MySQL、PostgreSQL、SQLite等),只需修改配置文件中的数据库引擎即可。

## 定义模型与生成表

以用户信息管理为例,首先在应用的 models.py 中定义Person模型:


from django.db import models

class Person(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32, null=False, unique=True)
    age = models.IntegerField()
    birthday = models.DateField()# 日期,YYYY-MM-DD格式

    def __str__(self):
      return 'name:{}'.format(self.name)

    class Meta:
      db_table = 'person'# 指定数据库表名


模型中定义的自增主键id、字符串字段name、整数字段age、日期字段birthday,都是Django ORM支持的常用字段。执行迁移命令即可在数据库中生成对应的“person”表:


python manage.py makemigrations
python manage.py migrate


## 新增记录(Create)

新增操作有两种常见写法:使用create()方法或先实例化再save()。

### 方法一:类名.objects.create()


models.Person.objects.create(name=usrname, age=age, birthday=bir)


### 方法二:实例化后save()


obj = models.Person(name=usrname, age=age, birthday=bir)
obj.save()


在视图函数 add_person 中处理POST请求,获取表单数据并写入数据库:


def add_person(request):
    if request.method == 'POST':
      usrname = request.POST.get('username')
      age = request.POST.get('age')
      bir = request.POST.get('bir')
      # 保存到数据库
      models.Person.objects.create(name=usrname, age=age, birthday=bir)
      return redirect('/app01/all_person/')
    return render(request, 'app01/add_person.html')


对应的模板 add_person.html 包含一个POST表单,需添加{% csrf_token %}防止跨站请求伪造:


<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>添加用户</title></head>
<body>
<form action="/app01/add_person/" method="post">
    {% csrf_token %}
    <p>用户名: <input type="text" name="username"></p>
    <p>年龄: <input type="text" name="age"></p>
    <p>生日: <input type="text" name="bir"></p>
    <p><input type="submit" value="添加"></p>
</form>
</body>
</html>


## 查询记录(Read)

使用类名.objects.all()获取所有记录,返回QuerySet对象,可在模板中迭代:


def all_person(request):
    person_lst = models.Person.objects.all()
    return render(request, 'app01/all_person.html', {'person_lst': person_lst})


模板中遍历显示数据,注意日期字段使用|date:'Y-m-d'过滤器格式化:


<table border="1">
    <tr><td>序号</td><td>id</td><td>姓名</td><td>年龄</td><td>生日</td><td>操作</td></tr>
    {% for person in person_lst %}
    <tr>
      <td>{{ forloop.counter }}</td>
      <td>{{ person.id }}</td>
      <td>{{ person.name }}</td>
      <td>{{ person.age }}</td>
      <td>{{ person.birthday|date:'Y-m-d' }}</td>
      <td>
            <a href="/app01/edit_person/?id={{ person.id }}">修改</a>
            <a href="/app01/delete_person/?id={{ person.id }}">删除</a>
      </td>
    </tr>
    {% endfor %}
</table>


## 删除记录(Delete)

删除有两种常用方式:get()取出单个对象后调用delete(),或filter()过滤后删除。推荐使用filter(),因为即使没有匹配记录也不会抛出异常:


def delete_person(request):
    ids = request.GET.get('id')
    # 方式一:get().delete()
    # person_obj = models.Person.objects.get(id=ids)
    # person_obj.delete()
    # 方式二:filter().delete()
    ret = models.Person.objects.filter(id=ids).delete()
    return redirect('/app01/all_person/')


## 修改记录(Update)

修改也有两种模式:先查询出对象,修改属性后save();或者直接用filter().update()批量更新。后者更简洁,且会执行一条UPDATE SQL语句:


def edit_person(request):
    if request.method == 'POST':
      usrname = request.POST.get('username')
      age = request.POST.get('age')
      bir = request.POST.get('bir')
      id = request.POST.get('id')
      # 方式一:对象赋值后save()
      # person_obj = models.Person.objects.get(id=id)
      # person_obj.name = usrname
      # person_obj.age = age
      # person_obj.birthday = bir
      # person_obj.save()
      # 方式二:filter().update()
      models.Person.objects.filter(id=id).update(name=usrname, age=age, birthday=bir)
      return redirect('/app01/all_person/')
    else:
      id = request.GET.get('id')
      person_obj = models.Person.objects.get(id=id)
      return render(request, 'app01/edit_person.html', {'person_obj': person_obj})


修改用的模板同样需要包含CSRF令牌,并将现有数据填充到输入框中:


<!DOCTYPE html>
<html>
<head><meta charset="UTF-8"><title>修改用户</title></head>
<body>
<form action="/app01/edit_person/" method="post">
    <p><input type="hidden" name="id" value="{{ person_obj.id }}"></p>
    {% csrf_token %}
    <p>用户名: <input type="text" name="username" value="{{ person_obj.name }}"></p>
    <p>年龄: <input type="text" name="age" value="{{ person_obj.age }}"></p>
    <p>生日: <input type="text" name="bir" value="{{ person_obj.birthday|date:'Y-m-d' }}"></p>
    <p><input type="submit" value="保存"></p>
</form>
</body>
</html>


## 总结

通过上述代码,我们完整实现了Django ORM的增删改查操作。ORM屏蔽了底层数据库差异,开发者只需关注Python对象的操作,极大地提高了开发效率。在实际项目中,还可以利用ORM的过滤、排序、聚合、事务等高级功能进一步优化数据访问层。对于初学者,掌握Model定义及CRUD是进入Django Web开发的第一步。

热心网友2 发表于 2026-7-17 15:05:00

Re: Django ORM入门:增删改查操作与模型设计实战

这篇Django ORM入门教程写得很清晰,从模型定义、迁移到增删查操作都给出了完整代码和说明,非常适合刚接触Django的朋友跟着练习。特别喜欢你用add_person视图来演示create()的用法,同时配合模板展示,让人一目了然。一个小补充:生日字段在表单里输入时,记得要按YYYY-MM-DD格式来填,否则数据库会报错。另外后续如果能加上修改和删除的示例就更完善了。感谢分享!

热心网友2 发表于 2026-7-17 15:05:00

Re: Django ORM入门:增删改查操作与模型设计实战

感谢分享!这篇 Django ORM 入门写得很清晰实用,特别是对比了 `create()` 和 `save()` 两种新增方式,以及模板中日期过滤器的使用,对新手非常友好。想继续请教一下:查询部分用 `all()` 返回全部记录,如果要做条件筛选(比如按姓名模糊查找或年龄范围查询),通常是用 `filter()` 加上双下划线吗?期待后续的更新和删除操作讲解,希望能继续看到完整的 CRUD 代码示例。

热心网友2 发表于 2026-7-17 15:05:00

Re: Django ORM入门:增删改查操作与模型设计实战

楼主的教程写得很详细,从模型定义到增删查操作都涵盖了,代码示例也很完整,非常适合初学者一步步跟着实践。期待后续的更新和删除操作讲解,感谢分享!
页: [1]
查看完整版本: Django ORM入门:增删改查操作与模型设计实战