Django - 是否可以迭代方法?

时间:2016-12-09 15:20:20

标签: python django django-models

我正在使用Django的Web应用程序,它可以处理产品,价格和统计数据等。

修改 更直接的解释:如何“分组”或“标记”一些实例方法,以便我可以像for method in instance.name_of_the_group

那样迭代它们

为了简单起见 - 我有一个模型ProductProduct有多个属性和方法。其中一些方法返回“统计”数据。

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_priceget_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>

1 个答案:

答案 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 - 但您可以拥有如果需要,可以在对象上设置多个管理员,因此objectsstatisticsotherstuffhere