2010-10-09 3 views
0

У меня есть модель Django, показанная ниже, которую я использую, чтобы отслеживать, какие IP-адреса посещают мой сайт и когда.Django: Пожалуйста, помогите с этим запросом

class Visit(models.Model): 
    created   = models.DateTimeField(default=datetime.utcnow) 
    ip    = models.IPAddressField(editable=False) 

Я хотел бы написать метод на этой модели, которая возвращает количество дней в приняли за последние 100 посещений из определенного IP. Несколько посещений за один день (час и т. Д.) Из IP все считаются отдельными посещениями. Итак, если кто-то за 100 дней за последние 2 дня посетил сайт, он вернется 2, 100 раз за последние 8 дней, он вернется 8 и т. Д.

ответ

0

Простой подход - получить последние 100 объектов посещения для IP-адреса и подсчитать количество уникальных объектов created.

def num_of_dates(ip_addr)  
    dates = [v.created for v in Visit.objects.filter(ip=ip_addr).order_by('-created')[0:100]] 
    unique_dates = set(dates) 
    return len(unique_dates) 
+0

Спасибо, это выглядит почти правильно. Однако он всегда возвращает 100, а не количество дней. Я подозреваю, что это потому, что created - это поле DateTime, поэтому каждая дата уникальна. – FunLovinCoder

+0

Вы можете сформировать объекты Date из объекта DateTime, чтобы получить уникальные даты вместо уникальных временных меток. Или вы можете следовать решению @fahhem, которое кажется более аккуратным. – rubayeet

1

Вы, вероятно, хотите, чтобы изменить значение по умолчанию = для created_on быть auto_now_add, поскольку datetime.utcnow не обновляется, если вы используете другие, чем сервер Dev серверов:

class Visit(models.Model): 
    created   = models.DateTimeField(auto_now_add=True,editable=False) 
    ip    = models.IPAddressField(editable=False) 

from datetime import datetime 
def days_for_100(ip_addr): 
    now = datetime.now() 
    dates = Visit.objects.filter(ip=ip_addr) 
    if dates.count()<100: 
    latest = dates.latest('-created') 
    else: 
    latest = dates.dates('created','day',order='DESC')[99] 
    return (now-latest).days # timedelta.days 

Это возвращает сколько дней назад произошло 100-летнее посещение (или как давно первый визит произошел, если было менее 100 посещений)

+0

Я пробовал это (после изменения created_on для создания), но получил индекс индекса вне диапазона. Что касается auto_add_now, я использую собственный метод save(), поэтому, надеюсь, это нормально. – FunLovinCoder

+0

пользовательский save() должен работать, но с использованием кода Django для auto_now_add уменьшает объем кода, который вы должны поддерживать/тестировать. Если вы получаете ошибку вне диапазона, это потому, что этот IP-адрес не посетил 100 раз, я отредактирую его, чтобы убедиться, что ошибки не произошло. – fahhem

+0

спасибо за попытку исправить. У IP было более 600 посещений, поэтому не знаю, почему я получил ошибку. Я пробовал новый код, но он все еще дает ошибку. На этот раз: Неверные аргументы order_by: ['--created']. – FunLovinCoder

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