查看: 188|回复: 3

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

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

## 定义模型与生成表

以用户信息管理为例,首先在应用的 models.py 中定义Person模型:
  1. from django.db import models
  2. class Person(models.Model):
  3.     id = models.AutoField(primary_key=True)
  4.     name = models.CharField(max_length=32, null=False, unique=True)
  5.     age = models.IntegerField()
  6.     birthday = models.DateField()  # 日期,YYYY-MM-DD格式
  7.     def __str__(self):
  8.         return 'name:{}'.format(self.name)
  9.     class Meta:
  10.         db_table = 'person'  # 指定数据库表名
复制代码

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

## 新增记录(Create)

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

### 方法一:类名.objects.create()
  1. models.Person.objects.create(name=usrname, age=age, birthday=bir)
复制代码

### 方法二:实例化后save()
  1. obj = models.Person(name=usrname, age=age, birthday=bir)
  2. obj.save()
复制代码

在视图函数 add_person 中处理POST请求,获取表单数据并写入数据库:
  1. def add_person(request):
  2.     if request.method == 'POST':
  3.         usrname = request.POST.get('username')
  4.         age = request.POST.get('age')
  5.         bir = request.POST.get('bir')
  6.         # 保存到数据库
  7.         models.Person.objects.create(name=usrname, age=age, birthday=bir)
  8.         return redirect('/app01/all_person/')
  9.     return render(request, 'app01/add_person.html')
复制代码

对应的模板 add_person.html 包含一个POST表单,需添加{% csrf_token %}防止跨站请求伪造:
  1. <!DOCTYPE html>
  2. <html>
  3. <head><meta charset="UTF-8"><title>添加用户</title></head>
  4. <body>
  5. <form action="/app01/add_person/" method="post">
  6.     {% csrf_token %}
  7.     <p>用户名: <input type="text" name="username"></p>
  8.     <p>年龄: <input type="text" name="age"></p>
  9.     <p>生日: <input type="text" name="bir"></p>
  10.     <p><input type="submit" value="添加"></p>
  11. </form>
  12. </body>
  13. </html>
复制代码

## 查询记录(Read)

使用类名.objects.all()获取所有记录,返回QuerySet对象,可在模板中迭代:
  1. def all_person(request):
  2.     person_lst = models.Person.objects.all()
  3.     return render(request, 'app01/all_person.html', {'person_lst': person_lst})
复制代码

模板中遍历显示数据,注意日期字段使用|date:'Y-m-d'过滤器格式化:
  1. <table border="1">
  2.     <tr><td>序号</td><td>id</td><td>姓名</td><td>年龄</td><td>生日</td><td>操作</td></tr>
  3.     {% for person in person_lst %}
  4.     <tr>
  5.         <td>{{ forloop.counter }}</td>
  6.         <td>{{ person.id }}</td>
  7.         <td>{{ person.name }}</td>
  8.         <td>{{ person.age }}</td>
  9.         <td>{{ person.birthday|date:'Y-m-d' }}</td>
  10.         <td>
  11.             <a href="/app01/edit_person/?id={{ person.id }}">修改</a>
  12.             <a href="/app01/delete_person/?id={{ person.id }}">删除</a>
  13.         </td>
  14.     </tr>
  15.     {% endfor %}
  16. </table>
复制代码

## 删除记录(Delete)

删除有两种常用方式:get()取出单个对象后调用delete(),或filter()过滤后删除。推荐使用filter(),因为即使没有匹配记录也不会抛出异常:
  1. def delete_person(request):
  2.     ids = request.GET.get('id')
  3.     # 方式一:get().delete()
  4.     # person_obj = models.Person.objects.get(id=ids)
  5.     # person_obj.delete()
  6.     # 方式二:filter().delete()
  7.     ret = models.Person.objects.filter(id=ids).delete()
  8.     return redirect('/app01/all_person/')
复制代码

## 修改记录(Update)

修改也有两种模式:先查询出对象,修改属性后save();或者直接用filter().update()批量更新。后者更简洁,且会执行一条UPDATE SQL语句:
  1. def edit_person(request):
  2.     if request.method == 'POST':
  3.         usrname = request.POST.get('username')
  4.         age = request.POST.get('age')
  5.         bir = request.POST.get('bir')
  6.         id = request.POST.get('id')
  7.         # 方式一:对象赋值后save()
  8.         # person_obj = models.Person.objects.get(id=id)
  9.         # person_obj.name = usrname
  10.         # person_obj.age = age
  11.         # person_obj.birthday = bir
  12.         # person_obj.save()
  13.         # 方式二:filter().update()
  14.         models.Person.objects.filter(id=id).update(name=usrname, age=age, birthday=bir)
  15.         return redirect('/app01/all_person/')
  16.     else:
  17.         id = request.GET.get('id')
  18.         person_obj = models.Person.objects.get(id=id)
  19.         return render(request, 'app01/edit_person.html', {'person_obj': person_obj})
复制代码

修改用的模板同样需要包含CSRF令牌,并将现有数据填充到输入框中:
  1. <!DOCTYPE html>
  2. <html>
  3. <head><meta charset="UTF-8"><title>修改用户</title></head>
  4. <body>
  5. <form action="/app01/edit_person/" method="post">
  6.     <p><input type="hidden" name="id" value="{{ person_obj.id }}"></p>
  7.     {% csrf_token %}
  8.     <p>用户名: <input type="text" name="username" value="{{ person_obj.name }}"></p>
  9.     <p>年龄: <input type="text" name="age" value="{{ person_obj.age }}"></p>
  10.     <p>生日: <input type="text" name="bir" value="{{ person_obj.birthday|date:'Y-m-d' }}"></p>
  11.     <p><input type="submit" value="保存"></p>
  12. </form>
  13. </body>
  14. </html>
复制代码

## 总结

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

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

使用道具 举报

发表于 2 小时前 | 显示全部楼层

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

楼主的教程写得很详细,从模型定义到增删查操作都涵盖了,代码示例也很完整,非常适合初学者一步步跟着实践。期待后续的更新和删除操作讲解,感谢分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-7-17 17:46 , Processed in 0.026437 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部