기술나눔

추가, 삭제, 수정, 검색, 정렬, 그룹화 등 Django의 일반적인 ORM 작업

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Django의 ORM(Object Relational Mapping)은 데이터베이스와 상호 작용하는 편리한 방법을 제공합니다.

1. 장고 모델


在 `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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

마이그레이션 명령을 실행하여 데이터베이스 테이블을 만듭니다.

python manage.py makemigrations
python manage.py migrate
  • 1
  • 2

2. 생성

단일 개체 만들기
from myapp.models import Person

# 创建并保存一个新对象
person = Person(name='Alice', age=25, city='New York')
person.save()
  • 1
  • 2
  • 3
  • 4
  • 5
사용 create() 방법
person = Person.objects.create(name='Bob', age=30, city='Los Angeles')
  • 1

3. 읽기

모든 객체 가져오기
people = Person.objects.all()
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
단일 객체 가져오기
person = Person.objects.get(id=1)
print(person.name, person.age, person.city)
  • 1
  • 2
필터 사용
# 获取所有年龄大于25的人
people = Person.objects.filter(age__gt=25)
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
  • 4

4. 업데이트

단일 객체 업데이트
person = Person.objects.get(id=1)
person.age = 26
person.save()
  • 1
  • 2
  • 3
일괄 업데이트
Person.objects.filter(city='New York').update(city='NYC')
  • 1

5. 삭제

단일 개체 삭제
person = Person.objects.get(id=1)
person.delete()
  • 1
  • 2
일괄 삭제
Person.objects.filter(age__lt=20).delete()
  • 1

6. 주문

단일 필드로 정렬
people = Person.objects.all().order_by('age')
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
여러 필드로 정렬
people = Person.objects.all().order_by('city', '-age')
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3

7. 그룹화

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'])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
사용 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}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
F 객체는 필드 간 비교를 수행합니다.
from django.db.models import F

# 获取年龄大于等于城市长度的人
people = Person.objects.filter(age__gte=F('city__length'))
for person in people:
    print(person.name)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6