Django – é possível iterar sobre methods?

Eu estou trabalhando em um aplicativo da Web no Django que trabalha com produtos, preços e statistics etc.

EDIT: Mais simples explicação: Como “agrupar” ou “marcar” alguns dos methods de instância para que eu possa iterar sobre eles como for method in instance.name_of_the_group

Para simplificar, tenho um modelo de Product . Product possui vários atributos e methods. Alguns desses methods retornam dados “estatísticos”.

 class Product(models.Model): name = ... ... def save(... ... def get_all_colors(self): .... def get_historical_average_price(self): #statistic method price =  return price def get_historical_minimal_price(self): #statistic method ... return price 

Portanto, há vários methods, como get_historical_average_price e get_historical_minimal_price .

Agora eu tenho que escrever labels e chamar esses methods um por um no projeto. Por exemplo, quando eu gero uma tabela ou cria uma exportação XML.

Eu gostaria de poder de alguma forma “marcá-los” que esses são methods “estatísticos”, dar-lhes algum nome, então eu seria capaz de trabalhar com eles usando loops etc.

Existe alguma maneira de fazer isso?

Exemplo no gerador de XML:

  {% for product in products %}  {{ product.code }} {{ product.name }}  {{ product.get_historical_average_price}} {{ product.get_historical_minimal_price}}   {% endfor %}  

Então eu faria algo como:

  {% for statistic_method in product.statistics %} {{ statistic_method }} {% endfor %}  

ao invés de:

  {{ product.get_historical_average_price}} {{ product.get_historical_minimal_price}}  

Esse é um ótimo caso de uso para usar gerenciadores de modelo personalizados , pois você pode usar ou replace os nomes que eles usam lá.

Então, no seu exemplo, algo como:

 class StatisticsManager(models.Manager): def historical_average_price(self): ... class Product(models.Model): name = ... statistics = StatisticsManager() 

Qual seria então chamado no formulário

product_price = Product.statistics.get_historical_average_price

e assim por diante.

Editar:

Eu esqueci – como você está sobrescrevendo o gerenciador de objects padrão, eu acredito que você precisará explicitar isso como um gerenciador, de acordo com este artigo – mas você pode ter vários gerenciadores em um object, se desejar, então objects , statistics , outras otherstuffhere .