Подтвердить что ты не робот

Получите различные значения Queryset по полю

У меня есть эта модель:

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?

EDIT:

Я вижу, что могу использовать:

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 и принимая удар db?

# Hope it something like this...
values.distinct().count()
4b9b3361

Ответ 1

Что вы хотите:

Visit.objects.filter(stuff).values("ip_address").annotate(n=models.Count("pk"))

Что это такое - получить все ip_addresses, а затем он получает количество первичных ключей (aka number rows) для каждого ip-адреса.

Ответ 2

С Alex Answer. У меня также есть n: 1 для каждого элемента. Даже с отдельным() предложением.

Это странно, потому что это возвращает большое количество элементов:

Visit.objects.filter(stuff).values("ip_address").distinct().count()

Но когда я повторяю "Visit.objects.filter(stuff).values ​​(" ip_address "). distinct()" У меня есть намного больше элементов и некоторые дубликаты...

EDIT:

Предложение фильтра вызывало у меня проблемы. Я фильтровался с другим полем таблицы, и был создан SQL JOIN, который разбивал разные вещи. Я использовал этот намек, чтобы увидеть действительно используемый запрос:

q=Visit.objects.filter(myothertable__field=x).values("ip_address").distinct().count()
print q.query

Затем я вернул класс на witch. Я делал запрос и фильтр для соединения, которое не полагается на какой-либо идентификатор "Посещения".

надеюсь, что это поможет