2011-03-23 28 views
8

Tôi có một mô hình như thế này:Làm thế nào để có được mới nhất của nhiều nhóm cùng một lúc

class Foo(models.Model): 
    date = models.DateTimeField() 
    language = models.TextField() 
    # other stuff 

Và tôi muốn nhóm Foo s theo ngôn ngữ, sau đó nhận được một trong những mới nhất trong mỗi nhóm. Tôi đã không thể tìm ra cách sử dụng API QuerySet của django để làm điều này (một cách trung thực, tôi cũng không biết cách thực hiện nó trong SQL). Vì vậy, ví dụ:

pk | date | language 
---+--------+------------------ 
1 | 1:00 | python 
2 | 1:30 | python/django 
3 | 1:45 | haskell 
4 | 2:15 | python 
5 | 2:45 | haskell 

Tôi muốn để có được một cái gì đó giống như kết quả này:

{ 'python': 4, 'python/django': 2, 'haskell': 5 } 

đâu có lẽ thay vì con số những người đã hoàn thành Foo đối tượng.

+1

Bạn có bảng riêng cho ngôn ngữ không? Trong trường hợp này, có thể bạn sẽ có thể lấy các dữ liệu đó bằng cách sử dụng anotate() hoặc một cái gì đó tương tự. – Agonych

+0

@ Agonych, tôi không thấy nó quan trọng như thế nào nếu tôi có một bảng ngôn ngữ. Bạn có gợi ý rằng tôi theo dõi 'Foo' mới nhất như một trường trong bảng ngôn ngữ? – luqui

+0

Không, nhưng bạn có thể kéo ngày mới nhất cho mỗi bản ghi hoặc với chú thích (latest_date = Max ('foos__date') (cung cấp foos là many_to_many với Foo) hoặc bằng cách sử dụng hàm như get_max_date() trong mô hình Ngôn ngữ – Agonych

Trả lời

0

Hãy thử điều này:

Foo.objects.values ​​('ngôn ngữ') chú thích (MAX_DATE = Max ('date')) order_by()

Hay bạn thực sự cần ID của hồ sơ.. với ngày tối đa?

Bạn có thể muốn đọc: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

+0

Yeah – luqui

+0

Bạn không thể nhận được nó trong một truy vấn - bởi vì mô hình này cho phép có hai bản ghi với cùng giá trị cho 'ngôn ngữ' và 'ngày' nhưng với ID khác nhau. làm một truy vấn cho mỗi mục trong tập hợp kết quả để tìm thấy nó là ID thực tế – Agonych

+4

Truy vấn chính nó là khá đơn giản: SELECT 'id', max (' date'), 'language' TỪ foo group theo' language' order by ' ngôn ngữ'; – Agonych

2

Bạn có thể sử dụng một truy vấn liệu để giải quyết vấn đề của bạn:

query = Foo.objects.raw('SELECT id, language, MAX(date) FROM sqltest_foo GROUP BY language;') 
for foo in query: 
    print foo.id, foo.language 

Obs: Tôi đang sử dụng cú pháp SQLite, nhưng ngôn ngữ SQL khác nên được tương tự .

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