1

我有一个看起来像这样的 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

但想知道是否有一种更简单的方法可以在所有功能中做到这一点。

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

4

2 回答 2

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(这可能会或可能不会损害您的数据库性能)。

于 2012-06-22T02:49:12.043 回答
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)
于 2019-11-12T09:43:38.520 回答