我在Django文档中看到:
Model Instance reference : Creating objects
您可能想要通过覆盖
__init__
方法来自定义模型。但是,如果这样做,请注意不要更改呼叫签名,因为任何更改都可能阻止保存模型实例 不要覆盖__init__
,而是尝试使用以下方法之一:
- 在模型类上添加classmethod。
- 在自定义管理器上添加方法(通常首选)
为什么第二种解决方案“通常是首选”?
在我的模型B
通过A
关系扩展模型OneToOne
的情况下,我想创建一个生成B
对象的方法同时生成相应的A
对象,如何按照建议使用自定义管理器“更好”,因为除了默认管理器提供的内容之外,我可能不会使用此管理器吗?
答案 0 :(得分: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
管理器类似的东西。