使用自定义管理器使用django创建对象的目的?

Lev*_*ans 5 django django-managers

我在Django文档中看到:

模型实例参考:创建对象

您可能想通过覆盖__init__方法来自定义模型.但是,如果这样做,请注意不要更改调用签名,因为任何更改都可能阻止保存模型实例.
而不是覆盖__init__,尝试使用以下方法之一:

  • 在模型类上添加classmethod.
  • 在自定义管理器上添加方法(通常是首选)

为什么第二种解决方案"通常是首选"?

在我有一个通过关系B扩展模型的模型的情况下,我想创建一个生成一个生成相应对象的对象的方法,如何使用自定义管理器"更好"给定我除了默认管理器提供的内容之外,可能不会使用此管理器吗?AOneToOneBA

jro*_*jro 5

我认为这是首选,因为它在代码中看起来更干净.你可能也会过多地阅读强调,因为好处或差异并不大.也就是说,在自己实施时我会使用建议的方法.

考虑以下模型(纯粹用于说明目的):

class Vehicle(models.Model):
    wheels = models.IntegerField()
    color = models.CharField(max_length=100)
Run Code Online (Sandbox Code Playgroud)

在您的应用中,经常需要获得所有汽车,或所有摩托车,或任何类型的车辆.为了保持干燥,您需要一些标准形式的检索数据.通过使用类方法,您将获得以下内容:

class Vehicle(models.Model):
    #(...)
    @classmethod
    def cars(cls):
        return Vehicle.objects.filter(wheels=4)

cars = Vehicle.cars()
green_cars = Vehicle.cars().filter(color='green')
Run Code Online (Sandbox Code Playgroud)

如果你创建一个经理,你会得到这样的东西:

class CarManager(models.Manager):
    def get_query_set(self):
        return super(CarManager, self).get_query_set().filter(wheels=4)

class Vehicle(models.Model):
    #(...)
    car_objects = CarManager()

cars = Vehicle.car_objects.all()
green_cars = Vehicle.car_objects.filter(color='green')
Run Code Online (Sandbox Code Playgroud)

在我看来,后者看起来更干净,特别是当事情变得更加复杂时.它使模型定义中的混乱更加清晰,并使类似于使用默认objects管理器.