我有一个模范客户
。我还有一个模型管理器,并且我添加了一个具有某些方法的类QuerySet
。 add_meta()
当我使用 Customers.objects.filter().add_meta() 时,我倾向于获取每个实例的所有元信息。
但是当我使用 Customer.objects.get(pk=1)
时,我无法使用该 meta_data()
方法。
这是我的代码。
可重用管理器
class CustomerManager(models.Manager):
"""A re-usable Manager to access a custom QuerySet"""
def __getattr__(self, attr, *args):
try:
return getattr(self.__class__, attr, *args)
except AttributeError:
return getattr(self.get_query_set(), attr, *args)
def get_query_set(self):
return self.model.QuerySet(self.model)
模型
class Project(models.Model):
objects = ProjectManager()
class QuerySet(QuerySet):
def add_meta(self):
return self.extra(
select={"priority": "COALESCE(bm_rank, sales_rank, created_at)",
"size": "order_size_price*order_size_weight",
"revenue": "current_selling_price*order_size_weight"
},
order_by=["priority"])
尝试了以下方法
Project.objects.filter(pk=5).add_meta().get().size
这不起作用
Project.objects.get(pk=5).add_meta()
任何人都可以知道我如何仍然可以将 add_meta
与 get 和此现有代码一起使用。
最佳答案
您可以简单地向模型类添加属性,因为您的元信息仅涉及一些简单的计算:
class Project(models.Model):
# your fields....
@property
def size(self):
return self.order_size_price * self.order_size_weight
# now this should work for every Project instance:
project = Project.objects.get(pk=1)
print project.size
如果您需要对这些“计算的”属性进行一些过滤,您仍然可以使用额外的选择...
关于python - 用于获取查询的模型管理器和模型方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22830651/