2009-07-25 11 views
2

Par exemple, j'ai un modèle Posts and Comments.Ajouter un champ au modèle, comme annoter

Post.objects.annotate(Count('comment')) 

Je fais une telle requête pour obtenir le nombre de commentaires pour chaque publication. Mais dans le modèle, je devrais vérifier si cette valeur est supérieure à 4. Comme je sais, il n'y a pas de telle templatetag. Pour l'instant je mets la méthode dans le modèle qui exécute l'opération de comparaison. La question est, comment mettre champ à modéliser comme annoter faire?

Répondre

1

Les modèles sont juste des classes et dans les instances de classe Python sont dynamiques. Cela signifie que vous pouvez ajouter n'importe quelle propriété à une instance en l'assignant simplement.

myinstance = MyModel.objects.get(pk=1) 
myinstance.mycomparisonattribute = True 

Cependant, je ne vois pas pourquoi c'est mieux que d'utiliser votre méthode de comparaison. Vous pouvez également utiliser une balise de gabarit personnalisée permettant de faire des comparaisons. La balise smart if de SmileyChris est excellente.

+0

Vous avez raison, j'ai compris mon erreur. J'écris à la place myinstance.mycomparisonattribute - myinstance ['mycomparisonattribute'] –

0

Vous pouvez le faire en utilisant la coutume Manager probablement, vous devriez essayer de créer Manager personnalisée avec méthode get_query_set() substituée, comme décrit here

0

Il y a plusieurs façons dont vous pouvez ajouter et attribut supplémentaire à une classe. Si c'est un attribut qui ne peut être calculé qu'une seule fois et utilisé comme lecture seule à partir de ce moment, je suggère d'utiliser le décorateur de propriétés .

Par exemple:

@property 
def foo(self): 
    bar = do_some_calculation() 
    return bar 

Mais ce ne sera pas possible pour les cas où vous voulez vérifier le compte d'un certain type d'objet, car il va changer au fil du temps.

Les fonctions du gestionnaire doivent être utilisées pour renvoyer un ensemble d'objets. Si vous voulez retourner une valeur booléenne indiquant le si un poste a plus de 4 commentaires, vous pouvez ajouter une fonction au modèle:

def more_than_4_replies(self): 
    return self.objects.count() > 4 

Et vous pouvez également utiliser l'agrégation pour annoter l'objet défini vous passez dans modèle et utilisez une balise if améliorée comme smart-if ou pyif.

Questions connexes