2009-06-26 61 views
2

我已经在我的模型下面的类文件显示行从另一个表计数在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 

我愿意做订阅的一个特定HardwareNode数的计数,并显示在管理员硬件节点类的部分例如10个订阅托管在节点2

我还在学习Django和我不知道在那里我会做到这一点。可以/我应该在models.py还是HTML中执行?

感谢,

-seth

回答

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只是为了简洁,但通常我认为这将是一个更好的选择(风格,可维护性等)使用命名的。

+0

这将行不通,因为self.subscription_set是一种方法和不具有的长度。另外,您不应该在查询集上使用len(),因为这会强制评估。改用self.subscription_set.count()。 – 2009-06-26 12:33:00

0

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

相关问题