5

我在 Django 文档中看到:

模型实例参考:创建对象

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

  • 在模型类上添加一个类方法。
  • 在自定义管理器上添加方法(通常首选)

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

在我有一个通过关系B扩展模型的模型的情况下,并且我想创建一个生成对象的方法,该对象也生成相应的对象,鉴于我,按照建议使用自定义管理器如何“更好” '可能不会将此管理器用于默认管理器提供的功能之外的其他任何东西?AOneToOneBA

4

1 回答 1

5

我认为它是首选,因为它在代码中看起来更干净。您也可能对强调的内容读得太多了,因为好处或差异并没有那么大。也就是说,在我自己实施事情时,我确实使用了建议的方法。

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

class Vehicle(models.Model):
    wheels = models.IntegerField()
    color = models.CharField(max_length=100)

在您的应用程序中,经常需要获取所有汽车、所有摩托车或任何类型的车辆。为了保持干燥,您需要某种标准形式的检索此数据。通过使用类方法,您将获得以下信息:

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

cars = Vehicle.cars()
green_cars = Vehicle.cars().filter(color='green')

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

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')

在我看来,后者看起来更干净,尤其是当事情变得更复杂时。它使您的模型定义变得杂乱无章,并使事情类似于使用默认objects管理器。

于 2013-08-08T15:14:23.387 回答