我有一个看起来像这样的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
但是想知道是否有更简单的方法来跨所有功能。
有很多人会说,“你为什么这样做?”。它与遗留但仍处于活动状态的数据库的模型继承有关。
答案 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)