2010-08-08 1 views
36

Я получил эту модель:получить различные значения QuerySet поля

class Visit(models.Model): 
    timestamp = models.DateTimeField(editable=False) 
    ip_address = models.IPAddressField(editable=False) 

If посещает пользователь несколько раз за один день, как я могу фильтровать для уникальных строк, основанных на поле 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 и принимая дб хит?

# Hope it's something like this... 
values.distinct().count() 
+0

возможный дубликат [Выберите различные значения из поля таблицы] (http://stackoverflow.com/questions/2466496/select-distinct-values-from-a-table-field) –

ответ

32

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

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

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

+2

Я не думаю, что я полностью понимаю аннотацию. Как вы написали, мой ValuesQuerySet теперь имеет «n»: 1 добавляется к каждой записи. Я не уверен, что это говорит мне? – Scott

+7

Проблема, вероятно, в Meta.ordering - попробуйте этот файл 'Visit.objects.filter (stuff) .order_by(). Values ​​(" ip_address "). Annotate (n = models.Count (" pk "))' – Greg

+1

@Greg Thank вы! Я новичок в том, что 'ordering' и' order_by() 'вызывает проблемы с' distinct', но я не знал, как его решить, хотя он находится в документах QuerySet API под ['order_by()'] (https://docs.djangoproject.com/en/dev/ref/models/querysets/# order-by) "_ Если вы не хотите, чтобы какой-либо заказ был применен к запросу, даже не по умолчанию, вызовите' order_by() 'без параметров. " –

13

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

Это странно, потому что это возвращение хорошие номера деталей:

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

Но когда я перебирать "Visit.objects.filter (вещи) .values ​​(" IP_Address "). Отчетливый()" Я получил гораздо больше деталей и некоторые дубликаты ...

EDIT:

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

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

Затем я вернулся в класс на ведьму я делал запрос и фильтр, чтобы иметь объединение, которое не опирается на какой-либо «Визит» Я бы.

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

+0

Это вопрос или ответ? – User

+0

это был своего рода дополнение к ответу Алекса. Я попробовал, имел ту же проблему, что и vfxcode, и тогда я нашел почему. Поэтому я решил поделиться своими выводами. 3 года спустя, я признаю, что мой ответ был немного грязным, и я понимаю, почему вы спрашиваете об этом;) –