2011-12-21 44 views
8

Tôi đang cố gắng lọc người dùng theo ngày, nhưng không thể cho đến khi tôi có thể tìm ngày đầu tiên và cuối cùng của người dùng trong db. Trong khi tôi có thể có bộ lọc kịch bản của tôi ra dups sau này, tôi muốn làm điều đó ngay từ đầu bằng cách sử dụng của Django distinct vì nó làm giảm đáng kể. Tôi cố gắngDjango - nhận các ngày riêng biệt từ dấu thời gian

User.objects.values('install_time').distinct().order_by() 

nhưng vì install_time là một timestamp, nó bao gồm Date and time (mà tôi không thực sự quan tâm). Kết quả là, những người duy nhất nó lọc ra là những ngày mà chúng tôi có thể truy xuất ngày cài đặt của nhiều người dùng nhưng không phải lần.

Bất kỳ ý tưởng nào về cách thực hiện việc này? Tôi đang chạy này bằng cách sử dụng Django 1.3.1, Postgres 9.0.5, và phiên bản mới nhất của psycopg2.

EDIT: Tôi quên để thêm kiểu dữ liệu của install_time:

install_time = models.DateTimeField() 

EDIT 2: Dưới đây là một số lượng mẫu từ vỏ Postgres, cùng với một lời giải thích nhanh chóng của những gì tôi muốn:

2011-09-19 00:00:00 
2011-09-11 00:00:00 
2011-09-11 00:00:00 <--filtered out by distinct() (same date and time) 
2011-10-13 06:38:37.576 
2011-10-13 00:00:00 <--NOT filtered out by distinct() (same date but different time) 

Tôi biết về Manager.raw, nhưng thay vào đó, hãy sử dụng django.db.connection.cursor để viết truy vấn trực tiếp từ Manager.raw trả lại số RawQuerySet, IMO, tệ hơn là chỉ viết truy vấn SQL theo cách thủ công và lặp lại.

+1

có thể trùng lặp của http://stackoverflow.com/questions/3388559/django-model-group-by-datetimes-date – thatwasbrilliant

+0

@thatwasbrilliant Đó là chính xác những gì tôi đang được tìm kiếm; cảm ơn! Loại kỳ quặc mà nó chỉ mất 30 phút trên SO khi nó mất 2 giờ trên Google w/không có kết quả. – Edwin

+1

Bạn cần phải làm việc trên các kỹ năng của Google của bạn :) – thatwasbrilliant

Trả lời

7

Khi làm báo cáo về bộ dữ liệu lớn hơn itertools.group_by có thể là quá chậm. Trong những trường hợp tôi làm postgres xử lý các nhóm:

truncate_date = connection.ops.date_trunc_sql('day','timestamp') 
qs = qs.extra({'date':truncate_date}) 
return qs.values('date').annotate(Sum('amount')).order_by('date') 
+0

Cảm ơn đoạn mã @ till-backhaus; Tôi cần điều này cho một dự án khác. –

+0

Đây là phiên bản mà tôi cố gắng cập nhật: http://stackoverflow.com/a/8746532/246241 – tback

0

Tôi đã bỏ phiếu để đóng vì đây là số máy lẻ của this question, do đó, đây là câu trả lời nếu bạn không muốn truy cập liên kết, được phép của nosklo.


Tạo một hàm nhỏ để chỉ trích ngày: def extract_date (tổ chức): 'chiết xuất ngày bắt đầu từ một thực thể' trở entity.start_time.date()

Sau đó, bạn có thể sử dụng nó với itertools.groupby:

from itertools import groupby 

entities = Entity.objects.order_by('start_time') 
for start_date, group in groupby(entities, key=extract_date): 
    do_something_with(start_date, list(group)) 
+0

Vẫn còn hữu ích khi có câu hỏi của bạn xung quanh vì bạn không thể tìm thấy câu trả lời với 30 phút tìm kiếm trên google. Bạn nên chấp nhận câu trả lời này và để cho nó được :) Lần sau ai đó sử dụng ngôn ngữ của bạn để tìm kiếm vấn đề này, Q này sẽ xuất hiện trên google. –

+0

@YujiTomita Đó là lý do tôi đóng, không xóa. Tôi vẫn có câu trả lời đã đóng hiển thị trên Google. – Edwin

Các vấn đề liên quan