Django Custom Manager添加属性

时间:2012-06-22 01:06:10

标签: django django-custom-manager

我有一个看起来像这样的Django模型:

class MyModel(models.Model):
    field1 = models.IntegerField()
    field2 = models.IntegerField()
    nonDbField = SomeObject()
    objects = MyCustomManager()

field1实际上是SomeObject的抽象类的PK。

我想要一个自定义管理器,对于任何函数(all,filter,get等)返回的每个值,都会执行以下操作:

 value.nonDbField = SomeObject.objects.get(pk=value.field1)

我已经测试过我可以像这样手动覆盖get:

class MyCustomManager(models.Manager):
    def get(self, *args, **kwargs):
        value = super(MyCustomManager, self).get(*args, **kwargs)
        value.nonDbField = SomeObject.objects.get(listid=value.itemListID)
        return value

但是想知道是否有更简单的方法来跨所有功能。

有很多人会说,“你为什么这样做?”。它与遗留但仍处于活动状态的数据库的模型继承有关。

2 个答案:

答案 0 :(得分:2)

如果您需要nonDbField的值与field1(或模型中的任何其他字段)相关,您可以尝试这样的事情:

Class MyModel(models.Model):

    # your fields here...

    def _nonDbField(self):
        return SomeObject.objects.get(pk=self.field1)
    nonDbField = property(_nonDbField)

这允许你做这样的事情:

MyModel.objects.get(pk=1).nonDbField

请记住,每次访问nonDbField时都会进行数据库查询(这可能会或可能不会对您的数据库性能造成损害)。

答案 1 :(得分:0)

您可以将property用于计算字段

MyModel类(models.Model):

# your fields here...
first_name = models.CharField()
last_name = models.CharField()

@property
def fullname(self):
    return f"{self.first_name} {self.last_name}"

这允许您执行以下操作:

obj = MyModel.objects.get(pk=1)
print(obj.fullname)