2013-05-17 2 views
3

У меня есть простая модель Django с некоторыми интернет-сеансами (журналы Radius). И хочу показать это в моем шаблоне.Расширение Queryset модели с дополнительными атрибутами

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: Создание метода модели.

Я не хочу рассчитать имя хоста как метод модели, потому что он будет запущен для каждой записи, но количество сеансов для конкретного пользователя может быть очень большим - в этом случае это вызовет огромное количество 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%}?

Опять же: кажется, что я не могу сделать это как метод модели, поэтому я думаю, что я должен расширить результаты своей базы данных с помощью пользовательских.

P.S. Извините за пост на самом деле. Это моя первая попытка Stackoverflow. Спасибо!

+0

Лучше длинный, чем слишком маленький. Важным является использование для руководства читателем. Добро пожаловать! –

ответ

2

Модель «метод». Создайте отдельный класс, который отвечает за поиск записей DNS и кэширует их и ссылается на экземпляр этого класса в дескрипторе модели.

+0

Вы читаете все мое сообщение. Спасибо вам за это! ;) Игнасио, какая техника кеширования должна использоваться? К сожалению, я новичок в Django, как мне обратиться к этому экземпляру в моей модели? – Lufa

+1

@Lufa: Используемый метод кэширования может отличаться, но очень простым было бы реализовать метод 2a по атрибуту класса. После того, как вы написали свой класс в [дескриптор протокола] (http://docs.python.org/2/howto/descriptor.html), вы просто назначаете его, как и любой другой дескриптор. 'class Radacct' ...' hostname = HostnameLookup() '...' print someradacct.hostname' –

Смежные вопросы