扩展模型的查询集,添加额外属性

3

我有一个简单的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 地址(nasipaddress)的主机名。 方法 1: 创建模型方法。 我不想将主机名计算为模型方法,因为它会针对每个记录触发,而特定用户的会话数可能非常大,在这种情况下,它将导致大量的 DNS 检查。1000 个会话= 1000 个 DNS 检查吗?.. 方法 2a: 视图级别。 我尝试在视图级别上进行此操作,仅检查唯一IP并获取带有 IP-主机名对的“本地”字典:
#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 %}循环中访问它在模板中?

再次说明:似乎我不能将其作为模型的方法,因此我认为我应该用自定义的结果扩展我的数据库结果。

P.S. 很抱歉这篇文章太长了。这是我在Stackoverflow上的第一次尝试。谢谢!


最好长而不要太小。重要的是使用<h*>来引导读者。欢迎! - Jorge Leitao
1个回答

2

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


你读完了我的所有帖子,谢谢! ;) Ignacio,应该使用什么缓存技术?抱歉,我是Django的新手,如何在我的模型中引用这个实例? - Lufa
1
@Lufa:使用的具体缓存技术可能会有所不同,但一个非常基本的技术是在类的属性上实现2a方法。一旦你将你的类写成描述符协议的形式,你只需要像任何其他描述符一样进行分配即可。class Radacct ... hostname = HostnameLookup() ... print someradacct.hostname - Ignacio Vazquez-Abrams

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,