我的模型文件中有以下类
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
答案 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可以很容易地在数据库中建立双向关系。