Para ecoar / estender o comentário de Jeff, o que acho que você deve procurar é simplesmente uma propriedade em sua classe Choice que calcule o número de votos associados a esse objeto:
class Choice(models.Model):
text = models.CharField(max_length=200)
def calculateVotes(self):
return Vote.objects.filter(choice=self).count()
votes = property(calculateVotes)
E então no seu modelo, você pode fazer:
{% for choice in choices %}
{{choice.choice}} - {{choice.votes}} <br />
{% endfor %}
A marca de modelo, IMHO é um pouco exagerada para esta solução, mas também não é uma solução terrível. O objetivo dos modelos no Django é isolá-lo do código em seus modelos e vice-versa.
Eu tentaria o método acima e veria o SQL que o ORM gera, pois não tenho certeza se ele pré-armazenará em cache as propriedades e apenas criará uma subseleção para a propriedade ou se iterativamente / on- demanda execute a consulta para calcular a contagem de votos. Mas, se gerar consultas atrozes, você sempre poderá preencher a propriedade em sua exibição com os dados que você mesmo coletou.
.items
chamada (como ilustrado em uma das outras respostas), é uma solução muito mais simples.Aqui está o modelo:
Basicamente,
.items
é uma palavra-chave do Django que divide um dicionário em uma lista de(key, value)
pares, bem como o método Python.items()
. Isso permite a iteração sobre um dicionário em um modelo do Django.fonte
items
é uma chamada de método Python no dicionário, não uma palavra-chave do Django. Como Alex Martelli aponta , é basicamente o mesmo queiteritems
. Como Wilhelm respondeu, a pesquisa de dicionário é a 3ª em precedência para pesquisas de pontos. Se você tiver um item no dicionário'items'
, receberá esse valor de volta em vez de uma lista de tuplas. Para testar: adicione{'items':'oops'}
ao seu dicionário e você obterá uma lista com marcadores de letras da palavra 'oops'você pode usar a notação de ponto:
fonte
my_dict[1][2]
modelo:my_dict.1.2
d.key.1
- nota o segundo.
Você precisa encontrar (ou definir) uma tag de modelo 'get', por exemplo, aqui .
A definição da tag:
E é usado como:
fonte
h.get(key,'default_value')
por causa do KeyErrorUse itens do dicionário:
fonte
nome do filtro django_template_filter get_value_from_dict
fonte
Semelhante à resposta de @russian_spy:
Isso pode ser adequado para quebrar dicionários mais complexos.
fonte
Idealmente, você criaria um método no objeto de escolha que se encontrasse em votos ou criaria um relacionamento entre os modelos. Uma tag de modelo que executou a pesquisa no dicionário também funcionaria.
fonte