【进阶】Django ORM入门:基础概念与使用
发布时间: 2024-06-27 11:05:35 阅读量: 66 订阅数: 112
![【进阶】Django ORM入门:基础概念与使用](https://files.realpython.com/media/model_to_schema.4e4b8506dc26.png)
# 2.1 模型和字段
### 2.1.1 模型的定义和使用
在 Django 中,模型用于表示数据库中的表。要定义一个模型,可以使用 `models.Model` 类。例如,以下代码定义了一个 `User` 模型:
```python
from django.db import models
class User(models.Model):
username = models.CharField(max_length=150)
email = models.EmailField()
```
模型定义后,可以使用 `objects` 属性来访问模型的查询集。查询集是一个对象集合,可以对其进行过滤、排序和聚合等操作。
### 2.1.2 字段的类型和选项
模型由字段组成,用于表示表中的列。Django 提供了多种字段类型,包括:
* `CharField`: 字符串字段,长度可指定
* `EmailField`: 电子邮件字段,自动验证格式
* `IntegerField`: 整数字段
* `BooleanField`: 布尔字段,表示真或假
* `ForeignKey`: 外键字段,表示与另一个模型的关联
每个字段都可以指定选项,例如 `max_length`、`null` 和 `blank`,以控制字段的行为。
# 2. Django ORM基础概念
### 2.1 模型和字段
#### 2.1.1 模型的定义和使用
模型是Django ORM用来描述数据库中实体的类。它定义了实体的属性和行为。要创建一个模型,可以使用以下语法:
```python
from django.db import models
class ModelName(models.Model):
# 模型字段定义
```
例如,创建一个表示用户的模型:
```python
from django.db import models
class User(models.Model):
username = models.CharField(max_length=150, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
```
#### 2.1.2 字段的类型和选项
Django ORM提供了多种字段类型,用于定义模型的属性。常见的字段类型包括:
| 字段类型 | 描述 |
|---|---|
| CharField | 字符串字段 |
| EmailField | 电子邮件字段 |
| IntegerField | 整数字段 |
| FloatField | 浮点数字段 |
| BooleanField | 布尔字段 |
| DateField | 日期字段 |
| TimeField | 时间字段 |
| DateTimeField | 日期和时间字段 |
每个字段类型都有自己的选项,用于控制字段的行为。例如,`CharField`字段可以指定最大长度,`IntegerField`字段可以指定最小和最大值。
### 2.2 查询集
#### 2.2.1 查询集的创建和使用
查询集是Django ORM用来查询和操作数据库中数据的对象。要创建一个查询集,可以使用以下语法:
```python
from django.db.models import QuerySet
queryset = ModelName.objects.all()
```
查询集是一个类似列表的对象,包含了模型的所有实例。可以使用查询集的方法对数据进行过滤、排序和聚合等操作。
#### 2.2.2 过滤和排序查询集
可以使用`filter()`和`order_by()`方法对查询集进行过滤和排序。例如,过滤出所有用户名为`admin`的用户:
```python
queryset = User.objects.filter(username='admin')
```
排序查询集中的结果,可以使用`order_by()`方法。例如,按用户名升序排序:
```python
queryset = User.objects.order_by('username')
```
### 2.3 关联
#### 2.3.1 一对一、一对多和多对多的关联
Django ORM支持多种关联类型,用于表示模型之间的关系。常见的关联类型包括:
| 关联类型 | 描述 |
|---|---|
| 一对一 | 一个模型实例与另一个模型实例最多关联一次 |
| 一对多 | 一个模型实例与多个模型实例关联 |
| 多对多 | 多个模型实例与多个模型实例关联 |
#### 2.3.2 关联的查询和操作
可以使用`ForeignKey`、`ManyToManyField`等字段类型来定义关联。例如,定义一个用户与组的一对多关联:
```python
from django.db import models
class Group(models.Model):
name = models.CharField(max_length=150)
class User(models.Model):
username = models.CharField(max_length=150, unique=True)
email = models.EmailField(unique=True)
password = models.CharField(max_length=128)
group = models.ForeignKey(Group, on_delete=models.CASCADE)
```
可以使用`_set`属性访问关联的模型实例。例如,获取所有属于特定组的用户:
```python
group = Group.objects.get(name='admin')
users = group.user_set.all()
```
# 3.1 聚合函数
聚合函数用于对查询集中的数据进行聚合操作,如求和、求平均值、求最大值等。Django ORM 提供了丰富的聚合函数,可以满足各种数据分析需求。
#### 3.1.1 常用的聚合函数和用法
| 聚合函数 | 描述 | 用法 |
|---|---|---|
| `aggregate()` | 执行多个聚合操作,返回一个字典 | `Model.objects.aggregate(Sum('field1'), Avg('field2'))` |
| `annotate()` | 为查询集添加聚合结果作为新的字段 | `Model.objects.annotate(total_sum=Sum('field1'))` |
| `Sum()` | 求和 | `Model.objects.aggregate(total_sum=Sum('field1'))` |
| `Avg()` | 求平均值 | `Model.objects.aggregate(avg_value=Avg('field1'))` |
| `Max()` | 求最大值 | `Model.
0
0