使用其他属性扩展Model的Queryset

时间:2013-05-17 08:27:12

标签: python django

我有简单的Django模型和一些互联网会话(Radius日志)。并希望在我的模板中显示它。

models.py:

class Radacct(models.Model):
    radacctid = models.BigIntegerField(primary_key=True)
    username = models.CharField(max_length=253)
    nasipaddress = models.IPAddressField()
    class Meta:
        db_table = u'radacct'

view.py:

def ajax_radius_sessions(request, username):
    radius_sessions = Radacct.objects.filter(username=username).order_by('-radacctid')

template.html:

{% for session in radius_sessions %}
    {{ session.username }}, {{ session.nasipaddress }}</br>
{% endfor %}

在我的模板中,我还需要根据用户的ip-address(nasipaddress)显示主机名。

方法1: 创建模型的方法。

我不想将Hostname计算为Model的方法,因为它将针对每条记录触发,但特定用户的会话数量可能非常大 - 在这种情况下会导致大量的DNS检查。 1000个会话= 1000个DNS检查?..

方法2a: 查看级别。

我在View级别尝试这个,只检查唯一的IP并获得带有IP-Hostname对的“本地”字典:

#servers={'192.168.100.1':'alpha', '192.168.100.2':'beta', '192.168.100.3':'gamma'}

但我无法在模板中访问此词典,使用键作为变量:

#Wrong!
{{ servers[session.nasipaddress] }}

方法2b: 查看级别。将新属性添加到Queryset实例。

也许我可以为我的Radacct模型添加一个新属性,该模型与数据库无关。并在我的视图中按主机名填写?

计算某个“属性”然后在Queryset {%for%}循环中的模板中访问它的正确方法是什么?

再说一遍:我似乎无法将其作为Model的方法,因此我认为我应该使用自定义的方法扩展我的数据库结果。

P.S。对不起,这是一个非常宽松的帖子。这是我对Stackoverflow的第一次尝试。谢谢!

1 个答案:

答案 0 :(得分:2)

模型“方法”。创建一个单独的类,负责查找DNS条目并缓存它们,并在模型的描述符中引用此类的实例。