django的模型类管理器——数据库操作的封装详解

1. 模型类管理器的概念

在Django中,模型类是处理数据库表的核心,一个Django模型类对应一张数据库表。模型类管理器是模型类的一部分,用于封装数据库操作。模型类管理器可以让我们更方便地进行数据的操作,比如筛选、排序、限制结果等等。

2. 默认管理器objects的使用

在Django中,每个模型类都隐含一个默认的管理器objects。默认管理器会为我们提供一些常用的数据库操作方法,使我们可以通过模型类进行操纵数据库,而不需要直接操作数据库。

2.1 查询所有记录

我们可以使用all()方法查询模型类对应的数据库表中的所有记录。

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

Person.objects.all()

使用all()方法可以返回模型类对应的表中的所有记录。

2.2 查询指定记录

我们可以使用get()方法查询模型类对应的数据库表中满足条件的单条记录。如果找不到符合条件的记录,此方法将抛出数据库异常。

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

Person.objects.get(name='Tom')

使用get()方法可以返回模型类对应的表中符合条件的单条记录。

2.3 对记录进行排序

我们可以使用order_by()方法对查询结果进行排序,可以通过传入一个或多个属性名来指定按照哪些属性排序。

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

Person.objects.order_by('age')

使用order_by()方法可以返回按照指定属性排序的模型类对应的表中的所有记录。

3. 自定义模型类管理器

我们也可以自定义模型类管理器,以提供更多的查询接口。自定义管理器并不会覆盖默认管理器,而是增加到模型类中。

3.1 创建自定义管理器

创建自定义管理器需要在模型类中定义一个继承自models.Manager的类,然后将该类赋值给一个模型类属性。

class UserManager(models.Manager):

def get_queryset(self):

return super().get_queryset().filter(is_deleted=False)

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

is_deleted = models.BooleanField(default=False)

objects = models.Manager() # The default manager.

users = UserManager() # The custom manager.

在这个例子中,我们创建了一个自定义管理器UserManager,并通过模型类属性users将其赋值给Person模型类。自定义管理器的get_queryset()方法将默认查询结果进一步过滤,只返回is_deleted为False的查询结果。

3.2 使用自定义管理器

我们定义完自定义管理器后,即可通过自定义管理器进行查询操作。可以通过以下方法获取指定管理器的Queryset:

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

is_deleted = models.BooleanField(default=False)

objects = models.Manager() # The default manager.

users = UserManager() # The custom manager.

Person.users.all()

使用自定义管理器可以更加方便地进行筛选,实现逻辑更易读懂,代码更易维护。

4. 管理器的链式调用

多个管理器可以进行链式调用,以实现更复杂的查询操作。

class UserManager(models.Manager):

def get_queryset(self):

return super().get_queryset().filter(is_deleted=False)

class ActiveUserManager(models.Manager):

def get_queryset(self):

return super().get_queryset().filter(is_active=True)

class Person(models.Model):

name = models.CharField(max_length=30)

age = models.IntegerField()

is_deleted = models.BooleanField(default=False)

is_active = models.BooleanField(default=False)

objects = models.Manager() # The default manager.

users = UserManager() # The custom manager.

active_users = ActiveUserManager() # The custom manager.

Person.active_users.users.all()

在这个例子中,我们使用两个自定义管理器进行链式调用。调用active_users可以获得is_active为True的用户,而调用users则进一步筛选出is_deleted为False的用户。

总结

模型类管理器是Django中的核心概念,它为我们提供了简便的封装。默认管理器提供了基础的数据库操作,而自定义管理器可以让我们实现更加灵活的查询,Chainable Managers可以灵活使用我们定义好的自定义管理器进行多种操作。使用模型类管理器需要仔细设计和实现,合理组织管理器之间的联系可以为我们提供更加高效和健壮的程序。

后端开发标签