Показать количество строк из другой таблицы в Django - PullRequest
2 голосов
/ 26 июня 2009

В моем файле моделей есть следующие классы

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

Я бы хотел подсчитать количество подписок для конкретного HardwareNode и отобразить его в разделе администратора для класса HardwareNode, например, 10 подписок, размещенных на узле 2.

Я все еще изучаю Джанго, и я не уверен, где я смогу это сделать. Могу ли я сделать это в models.py или в HTML?

Спасибо

-seth

Ответы [ 2 ]

6 голосов
/ 26 июня 2009

При создании foreign_key другая модель получает менеджера, который возвращает все экземпляры первой модели (см. навигация назад ). В вашем случае он будет называться "subscription_set".

Кроме того, 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)
    subscription_count = lambda(self: self.subscription_set.count())

А затем включите subscription_count в список полей, которые будут перечислены на панели администратора.

Примечание: как обычно, я не проверял этот код, и он может даже не работать как есть, но он должен дать некоторое представление о том, как работать над вашей проблемой; более того, я использовал лямбду просто для краткости, но обычно я думаю, что было бы лучше (именуемый, поддерживающий и т. д.) использовать именованную.

0 голосов
/ 26 июня 2009

В вашем классе HardwareNode храните список подписок, а затем либо создайте функцию, которая возвращает длину этого списка, либо просто получите доступ к длине переменной через HTML. Это было бы лучше, чем просматривать все ваши подписки и подсчитывать количество аппаратных узлов, тем более что Django упрощает двустороннюю связь в базе данных.

...