显示Django中另一个表的行数

时间:2009-06-26 12:07:40

标签: python django django-models

我的模型文件中有以下类

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上的订阅数量,并在管理部分显示硬件节点类的订阅数量,例如节点2上托管的10个订阅。

我还在学习Django,我不知道我会在哪里完成这项工作。我可以/应该在models.py或HTML中吗?

谢谢,

-seth

2 个答案:

答案 0 :(得分:6)

创建foreign_key时,另一个模型会获得一个返回第一个模型的所有实例的管理器(请参阅navigating backward) 在您的情况下,它将被命名为“subscription_set”。

此外,Django允许模型中的虚拟字段,称为“模型方法”,它们与数据库数据无关,但是作为模型的方法实现(参见model methods

总而言之,你可以拥有这样的东西:

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。

注意:像往常一样,我没有检查这段代码,它甚至可能没有按原样运行,但它应该对如何解决您的问题有所了解;此外,我使用lambda只是为了简洁,但通常我认为使用命名的是更好的选择(样式,可维护性等)。

答案 1 :(得分:0)

在您的HardwareNode类中保留一个Subscriptions列表,然后创建一个返回该列表长度的函数,或者只是通过HTML访问变量的长度。这比通过所有订阅和计算HardwareNode的数量要好,特别是因为Django可以很容易地在数据库中建立双向关系。