У меня есть эта модель:
class Visit(models.Model):
timestamp = models.DateTimeField(editable=False)
ip_address = models.IPAddressField(editable=False)
Если пользователь посещает многократно за один день, как я могу отфильтровать для уникальных строк на основе 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')
получить ValuesQuerySet просто IP полей. Теперь мой 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 и получая удар дб?
# Hope it's something like this...
values.distinct().count()
Вы хотите:
Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk"))
Это получает все ip_addresses, а затем подсчитывает количество первичных ключей (то есть количество строк) для каждого IP-адреса.