2009-06-26 13 views
2

Je limer les classes suivantes dans mes modèlesAfficher le nombre de lignes d'une autre table dans Django

class HardwareNode(models.Model): 
    ip_address = models.CharField(max_length=15) 
    port = models.IntegerField() 
    location = models.CharField(max_length=50) 
    hostname = models.CharField(max_length=30) 

    def __unicode__(self): 
     return self.hostname 

class Subscription(models.Model): 
    customer = models.ForeignKey(Customer) 
    package = models.ForeignKey(Package) 
    location = models.ForeignKey(HardwareNode) 
    renewal_date = models.DateTimeField('renewal date') 

    def __unicode__(self): 
     x = '%s %s' % (self.customer.hostname, str(self.package)) 
     return x 

Je voudrais faire un compte sur le nombre d'abonnements sur un HardwareNode particulier et afficher que sur l'administration section pour la classe HardwareNode 10 abonnements hébergés sur le nœud 2.

J'apprends toujours Django et je ne suis pas sûr d'où j'accomplirais cela. Est-ce que je peux/devrais-je le faire dans le fichier models.py ou HTML?

Merci,

-Seth

Répondre

6

Lors de la création d'un foreign_key, l'autre modèle obtient un gestionnaire qui renvoie toutes les instances du premier modèle (voir navigating backward) Dans votre cas, il serait nommé « subscription_set ».

En outre, Django permet des champs virtuels dans les modèles, appelés « Modèle méthodes », qui ne sont pas connectés aux données de base de données, mais sont mises en œuvre en tant que méthodes du modèle (voir model methods)

Mettre tous ensemble, vous peut avoir quelque chose comme ceci:

class HardwareNode(models.Model): 
    ip_address = models.CharField(max_length=15) 
    port = models.IntegerField() 
    location = models.CharField(max_length=50) 
    hostname = models.CharField(max_length=30) 
    subscription_count = lambda(self: self.subscription_set.count()) 

Et puis, inclure SUBSCRIPTION_COUNT dans la liste des champs à figurer dans le panneau d'administration. Remarque: comme d'habitude, je n'ai pas vérifié ce code, et il peut même ne pas fonctionner comme il est, mais il devrait donner une idée sur la façon de travailler sur votre problème; de plus, j'ai utilisé un lambda juste pour la brièveté mais d'habitude je pense que ce serait une meilleure option (style, maintenabilité, etc.) pour utiliser un nommé.

+0

Cela ne fonctionnera pas, car self.subscription_set est une méthode et n'a pas de longueur. De plus, vous ne devriez jamais utiliser len() sur les jeux de requête, car cela force l'évaluation. Utilisez plutôt self.subscription_set.count(). –

+1

une raison quelconque pour utiliser lambda plutôt qu'une fonction nommée? –

+0

Merci Daniel, je savais que j'oubliais quelque chose :-) (maintenant ça devrait être correct). Il n'y a pas de vraies raisons d'utiliser un lambda - juste une brièveté dans l'exemple. J'ai mis à jour les notes pour décourager son utilisation. –

0

Dans votre classe HardwareNode Dressez une liste des abonnements, puis créer une fonction qui renvoie la longueur de cette liste ou tout simplement accéder à la longueur de la variable dans le code HTML. Ce serait mieux que de passer en revue tous vos abonnements et de compter le nombre de HardwareNodes, d'autant plus que Django facilite la relation bidirectionnelle dans la base de données.

Questions connexes