2013-04-29 3 views
0

Je sais par exemple. object.poll_set.count, mais comment puis-je filtrer ceux-ci, donc je n'ai que le nombre de certains objets que je poll_set. Je veux dire quelque chose comme object.poll_set.filter(pk<20).count. Je suppose que je dois le faire dans la logique au lieu de la présentation, mais quelle est la meilleure façon de le faire? J'ai également besoin de trouver le «nombre imbriqué» de certains objets. J'ai trois modèles (modèle 1, modèle 2, modèle 3). Dans le modèle 1, je peux obtenir le nombre d'enregistrements du modèle 2 qui se réfère au modèle 1, mais j'ai aussi besoin du nombre d'enregistrements du modèle 3 qui fait référence à tout objet du modèle 2 qui fait référence à l'objet spécifique dans le modèle 1.Model_set.count avancé dans Django 1.5

J'imprime les objets du modèle 1 dans un ListView. Comment puis-je obtenir le nombre total d'enregistrements dans le modèle 2 qui se réfère à un objet dans le modèle 1, c'est-à-dire un total général du nombre d'objets que j'ai trouvés dans chaque objet. Dois-je compter cela dans ma boucle dans le modèle et l'imprimer dans le <tfoot>?

Répondre

0

La syntaxe correcte est object.poll_set.filter(pk__lt=20).count(). Django utilise des noms spéciaux pour comparer des valeurs telles que __lte, __iexact etc. Voir https://docs.djangoproject.com/en/1.5/ref/models/querysets/#field-lookups. Cela a été dans Django depuis les toutes premières versions. Ne comptez pas à l'intérieur d'une boucle car vous risquez de devoir effectuer de nombreuses recherches inutiles dans la base de données. Ainsi, lorsque vous avez deux modèles: Model1 (parent), Model2 (enfant) et que vous voulez voir tous les Model1 avec le nombre de Model2 ci-joint, vous ne Model1.objects.filter(whatever).annotate(model2_count=Count('model2'))

EDIT: pour clarifier où la fonctionnalité de comptage personnalisé doit être

votre point de vue pourrait ressembler à ceci:

views.py

def model1_list(request): 
    objects = Model1.objects.all().annotate(model2_count=Count('model2')) 
    return TemplateResponse(request, 'your_template.html', {'objects':objects}) 

et votre modèle "your_template.html":

{% for o in objects %} 
    <b>{{ o }}</b> - model2s: {{ o.model2_count }} <br/> 
{% endfor %} 
+0

Merci. Avec 'object.poll_set.filter (pk <20) .count' je voulais dire comme une balise de modèle. Puis-je trouver un équivalent à votre exemple dans le moteur de template? – user2232982

+0

Non. Le langage de modèle est stupide par conception. Pour la logique, vous devriez utiliser vos vues que vous programmez en python. – mawimawi

+0

Ok. Quelle est la meilleure façon de définir cette fonction de comptage personnalisée? Un templatetag? Une fonction de modèle? – user2232982

Questions connexes