django的增删改查,排序,分组等常用的ORM操作

Django 的 ORM(对象关系映射)提供了一种方便的方式来与数据库进行交互。

1. Django模型

复制代码
在 `myapp/models.py` 中定义一个示例模型:

```python
from django.db import models

class Person(models.Model):
    name = models.CharField(max_length=100)
    age = models.IntegerField()
    city = models.CharField(max_length=100)

    def __str__(self):
        return self.name

运行迁移命令来创建数据库表:

bash 复制代码
python manage.py makemigrations
python manage.py migrate

2. 增 (Create)

创建单个对象
python 复制代码
from myapp.models import Person

# 创建并保存一个新对象
person = Person(name='Alice', age=25, city='New York')
person.save()
使用 create() 方法
python 复制代码
person = Person.objects.create(name='Bob', age=30, city='Los Angeles')

3. 查 (Read)

获取所有对象
python 复制代码
people = Person.objects.all()
for person in people:
    print(person.name, person.age, person.city)
获取单个对象
python 复制代码
person = Person.objects.get(id=1)
print(person.name, person.age, person.city)
使用过滤器
python 复制代码
# 获取所有年龄大于25的人
people = Person.objects.filter(age__gt=25)
for person in people:
    print(person.name, person.age, person.city)

4. 改 (Update)

更新单个对象
python 复制代码
person = Person.objects.get(id=1)
person.age = 26
person.save()
批量更新
python 复制代码
Person.objects.filter(city='New York').update(city='NYC')

5. 删 (Delete)

删除单个对象
python 复制代码
person = Person.objects.get(id=1)
person.delete()
批量删除
python 复制代码
Person.objects.filter(age__lt=20).delete()

6. 排序 (Ordering)

按单个字段排序
python 复制代码
people = Person.objects.all().order_by('age')
for person in people:
    print(person.name, person.age, person.city)
按多个字段排序
python 复制代码
people = Person.objects.all().order_by('city', '-age')
for person in people:
    print(person.name, person.age, person.city)

7. 分组 (Grouping)

Django ORM 不直接支持分组操作,但可以使用 annotateaggregate 方法来实现类似的功能。

使用 annotate 进行分组计数
python 复制代码
from django.db.models import Count

# 按城市分组并计数
city_counts = Person.objects.values('city').annotate(count=Count('id'))
for city_count in city_counts:
    print(city_count['city'], city_count['count'])
使用 aggregate 进行聚合操作
python 复制代码
from django.db.models import Avg, Max, Min

# 计算平均年龄
average_age = Person.objects.aggregate(Avg('age'))
print(average_age)  # 输出: {'age__avg': 27.5}

# 计算最大和最小年龄
age_stats = Person.objects.aggregate(Max('age'), Min('age'))
print(age_stats)  # 输出: {'age__max': 30, 'age__min': 25}

8. 复杂查询

Q 对象进行复杂查询
python 复制代码
from django.db.models import Q

# 获取年龄大于25或城市为'New York'的人
people = Person.objects.filter(Q(age__gt=25) | Q(city='New York'))
for person in people:
    print(person.name, person.age, person.city)
F 对象进行字段间比较
python 复制代码
from django.db.models import F

# 获取年龄大于等于城市长度的人
people = Person.objects.filter(age__gte=F('city__length'))
for person in people:
    print(person.name)
相关推荐
q_354888515320 分钟前
计算机毕业设计:Python当当网图书大数据分析平台 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
大数据·爬虫·python·机器学习·数据分析·django·课程设计
q_35488851533 小时前
计算机毕业设计源码:Python动漫智能推荐与可视化分析系统 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型(建议收藏)✅
python·scrapy·数据分析·django·课程设计·旅游·推荐算法
B站计算机毕业设计之家4 小时前
Python 基于协同过滤的动漫推荐与数据分析平台 Django框架 协同过滤推荐算法 可视化 数据分析 大数据 大模型 计算机毕业设计(建议收藏)✅
大数据·python·scrapy·数据分析·django·课程设计·推荐算法
B站计算机毕业设计之家6 小时前
计算机毕业设计源码:Python图书数据智能采集与可视化大屏 当当网 Django框架 爬虫 Pandas 可视化 大数据 大模型 书籍(建议收藏)✅
爬虫·python·机器学习·信息可视化·django·pandas·课程设计
小陈工14 小时前
FastAPI性能优化实战:从每秒100请求到1000的踩坑记录
python·性能优化·django·flask·numpy·pandas·fastapi
vx-程序开发1 天前
springboot在线装修管理系统-计算机毕业设计源码56278
java·c语言·spring boot·python·spring·django·php
chushiyunen1 天前
python日志logging、django日志等
python·django
杰杰7981 天前
一文掌握Django模型——认识模型
数据库·python·django
漫随流水2 天前
旅游推荐系统(getEchartsData.py)
python·django·旅游
计算机徐师兄2 天前
Python基于Django的高校档案安全管理系统(附源码,文档说明)
python·django·高校档案安全管理系统·python高校档案安全管理·python高校档案管理系统·高校档案·高校档案管理系统