我正在使用Django的Web应用程序,它可以处理产品,价格和统计数据等。
修改
更直接的解释:如何“分组”或“标记”一些实例方法,以便我可以像for method in instance.name_of_the_group
为了简单起见 - 我有一个模型Product
。 Product
有多个属性和方法。其中一些方法返回“统计”数据。
class Product(models.Model):
name = ...
...
def save(...
...
def get_all_colors(self):
....
def get_historical_average_price(self): #statistic method
price = <some calculation>
return price
def get_historical_minimal_price(self): #statistic method
...
return price
因此有很多方法,例如get_historical_average_price
和get_historical_minimal_price
。
现在我必须在项目中逐个编写标签并调用这些方法。例如,当我生成表或创建XML导出时。
我希望能够以某种方式“标记”他们那些是“统计”方法,给他们一些名字,这样我就可以使用for
循环等来处理它们。
有没有办法做到这一点?
关于XML生成器的示例:
<products>
{% for product in products %}
<product>
<code>{{ product.code }}</code>
<name>{{ product.name }}</name>
<statistics>
<historical_average>{{ product.get_historical_average_price}}</historical_average>
<minimal_price>{{ product.get_historical_minimal_price}}</minimal_price>
</statistics>
</product>
{% endfor %}
</products>
所以我会这样做:
<statistics>
{% for statistic_method in product.statistics %}
<{{ statistic_method.name }}>{{ statistic_method }}</{{ statistic_method.name }}>
{% endfor %}
</statistics>
而不是:
<statistics>
<historical_average>{{ product.get_historical_average_price}}</historical_average>
<minimal_price>{{ product.get_historical_minimal_price}}</minimal_price>
</statistics>
答案 0 :(得分:0)
这是使用自定义model managers的一个很好的用例,因为您可以使用或覆盖它们在那里使用的名称。
所以在你的例子中,例如:
class StatisticsManager(models.Manager):
def historical_average_price(self):
...
class Product(models.Model):
name = ...
statistics = StatisticsManager()
然后以
形式调用 product_price = Product.statistics.get_historical_average_price
等等。
编辑:
我忘记了 - 因为您正在覆盖默认的objects
经理,我相信您需要明确地将其重新表述为经理,每this article - 但您可以拥有如果需要,可以在对象上设置多个管理员,因此objects
,statistics
,otherstuffhere
。