Django 的 ORM(對象關系映射)提供了一種方便的方式來與數據庫進行交互。
1. Django模型
在 `myapp/models.py` 中定義一個示例模型:```python
from django.db import modelsclass Person(models.Model):name = models.CharField(max_length=100)age = models.IntegerField()city = models.CharField(max_length=100)def __str__(self):return self.name
運行遷移命令來創建數據庫表:
python manage.py makemigrations
python manage.py migrate
2. 增 (Create)
創建單個對象
from myapp.models import Person# 創建并保存一個新對象
person = Person(name='Alice', age=25, city='New York')
person.save()
使用 create()
方法
person = Person.objects.create(name='Bob', age=30, city='Los Angeles')
3. 查 (Read)
獲取所有對象
people = Person.objects.all()
for person in people:print(person.name, person.age, person.city)
獲取單個對象
person = Person.objects.get(id=1)
print(person.name, person.age, person.city)
使用過濾器
# 獲取所有年齡大于25的人
people = Person.objects.filter(age__gt=25)
for person in people:print(person.name, person.age, person.city)
4. 改 (Update)
更新單個對象
person = Person.objects.get(id=1)
person.age = 26
person.save()
批量更新
Person.objects.filter(city='New York').update(city='NYC')
5. 刪 (Delete)
刪除單個對象
person = Person.objects.get(id=1)
person.delete()
批量刪除
Person.objects.filter(age__lt=20).delete()
6. 排序 (Ordering)
按單個字段排序
people = Person.objects.all().order_by('age')
for person in people:print(person.name, person.age, person.city)
按多個字段排序
people = Person.objects.all().order_by('city', '-age')
for person in people:print(person.name, person.age, person.city)
7. 分組 (Grouping)
Django ORM 不直接支持分組操作,但可以使用 annotate
和 aggregate
方法來實現類似的功能。
使用 annotate
進行分組計數
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
進行聚合操作
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 對象進行復雜查詢
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 對象進行字段間比較
from django.db.models import F# 獲取年齡大于等于城市長度的人
people = Person.objects.filter(age__gte=F('city__length'))
for person in people:print(person.name)