2010-10-09 79 views
0

我有一個Django模型,如下所示,我用它來跟蹤哪些ip地址訪問我的網站和何時。Django:請幫助這個查詢集

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

我想寫這個模型,返回天了從一個特定的IP的最後100次訪問次數的方法。來自IP的一天中的多次訪問(小時等)都被視爲單獨訪問。因此,如果有人在過去2天內對網站進行了100次訪問,則過去8天內將返回2,100次,返回8次,依此類推。

回答

0

一個簡單的方法是獲取IP地址的最後100個訪問對象並計算其中唯一的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而不是天數。我懷疑這是因爲創建的是DateTime字段,所以每個日期都是唯一的。 – FunLovinCoder 2010-10-09 20:24:21

+0

您可以從DateTime對象中構建Date對象以獲取唯一日期而不是唯一時間戳。或者你可以按照@ fahhem的解決方案看起來更整潔。 – rubayeet 2010-10-10 06:48:36

1

你可能要更改默認=對於要auto_now_add created_on因爲如果您使用的是開發服務器的其他服務器datetime.utcnow不更新:

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 2010-10-10 07:36:17

+0

自定義save()應該可以工作,但是使用Django的auto_now_add代碼可以減少必須維護/測試的代碼量。如果出現超出範圍的錯誤,那是因爲該IP未訪問過100次,我將對其進行編輯以確保不會發生錯誤。 – fahhem 2010-10-11 11:04:54

+0

謝謝你試圖修復它。知識產權有600多次訪問,所以不知道爲什麼我得到了錯誤。我已經嘗試了新的代碼,但它仍然給出了一個錯誤。這次:無效的order_by參數:['--created']。 – FunLovinCoder 2010-10-11 13:20:24