Compartir tecnología

Operaciones ORM comunes de Django, como agregar, eliminar, modificar, buscar, ordenar y agrupar

2024-07-12

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

El ORM (Mapeo relacional de objetos) de Django proporciona una forma conveniente de interactuar con la base de datos.

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

Ejecute el comando de migración para crear las tablas de la base de datos:

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

2. Crear

Crear un solo objeto
from myapp.models import Person

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

3. Leer

Obtener todos los objetos
people = Person.objects.all()
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
Obtener un solo objeto
person = Person.objects.get(id=1)
print(person.name, person.age, person.city)
  • 1
  • 2
Usar filtros
# 获取所有年龄大于25的人
people = Person.objects.filter(age__gt=25)
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
  • 4

4. Actualización

Actualizar un solo objeto
person = Person.objects.get(id=1)
person.age = 26
person.save()
  • 1
  • 2
  • 3
Actualización por lotes
Person.objects.filter(city='New York').update(city='NYC')
  • 1

5. Eliminar

Eliminar un solo objeto
person = Person.objects.get(id=1)
person.delete()
  • 1
  • 2
eliminación por lotes
Person.objects.filter(age__lt=20).delete()
  • 1

6. Realizar pedidos

Ordenar por un solo campo
people = Person.objects.all().order_by('age')
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3
Ordenar por múltiples campos
people = Person.objects.all().order_by('city', '-age')
for person in people:
    print(person.name, person.age, person.city)
  • 1
  • 2
  • 3

7. Agrupación

El ORM de Django no soporta directamente operaciones de agrupación, pero puedes usar annotate yaggregate métodos para lograr una funcionalidad similar.

usar annotate Realizar conteo grupal
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
usar aggregate Realizar operaciones de agregación
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. Consultas complejas

Objetos Q para consultas complejas
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
Los objetos F realizan comparaciones entre campos.
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