私はこのモデルを持っています:
class Visit(models.Model):
timestamp = models.DateTimeField(editable=False)
ip_address = models.IPAddressField(editable=False)
ユーザーが1日に複数回訪問した場合、IP フィールドに基づいて一意の行をフィルターするにはどうすればよいですか?(今日のユニーク訪問者数を知りたい)
today = datetime.datetime.today()
yesterday = datetime.datetime.today() - datetime.timedelta(days=1)
visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something?
編集:
以下が使用できることがわかりました:
Visit.objects.filter(timestamp__range=(yesterday, today)).values('ip_address')
ip フィールドのみの ValuesQuerySet を取得します。これで、QuerySet は次のようになります。
[{'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address':
u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}]
QuerySet を評価して DB に負荷をかけずに、これを一意性でフィルタリングするにはどうすればよいでしょうか?
# Hope it's something like this...
values.distinct().count()
ベストアンサー1
あなたが望むものは次のとおりです:
Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk"))
これは、すべての ip_addresses を取得し、各 IP アドレスの主キーの数 (つまり行数) を取得します。