gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 19:08:39 24 4
gpt4 key购买 nike

我在 Django 文档中看到:

Model Instance reference : Creating objects

You may be tempted to customize the model by overriding the __init__ method. If you do so, however, take care not to change the calling signature as any change may prevent the model instance from being saved.
Rather than overriding __init__, try using one of these approaches:

  • Add a classmethod on the model class.
  • Add a method on a custom manager (usually preferred)


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

在我有模型的情况下 B它扩展了一个模型 A通过 OneToOne关系,我想创建一个生成 B 的方法生成相应 A的对象对象也是如此,鉴于我可能不会将此管理器用于默认管理器提供的任何其他内容,因此按照建议使用自定义管理器如何“更好”?

最佳答案

我认为它是首选,因为它在代码中看起来更清晰。你也可能对强调读得太多了,因为好处或差异并不大。也就是说,当我自己实现事情时,我确实使用了建议的方法。

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

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 的内容。经理。

关于django - 使用自定义管理器用 django 创建对象的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18126227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com