Django query: get the last entries of all distinct

2020-07-23 07:06发布

问题:

I am trying to make a Django query for getting a list of the last entries for each distinct values from a MySQL database. I will show an example below as this explanation can be very complicated. Getting the distinct values by themselves obviously in Django is no problem using .values(). I was thinking to create couple of Django queries but that looks to be cumbersome. Is there an easy way of doing this.

For the example below. Suppose I want the rows with distinct Names with their last entry(latest date).

Name            email                 date
_________________________________________________

Dane            dane@yahoo.com        2017-06-20
Kim             kim@gmail.com         2017-06-10
Hong            hong@gmail.com        2016-06-25
Dane            dddd@gmail.com        2017-06-04
Susan           Susan@gmail.com       2017-05-21
Dane            kkkk@gmail.com        2017-02-01
Susan           sss@gmail.com         2017-05-20

All the distinct values are Dane, kim, Hong, Susan. I also want the rows with the latest dates associated with these distinct name. The list with entries I would like is the rows below. Notice Names are all distinct, and they are associated with the latest date.

 Name            email                 date
_________________________________________________

Dane            dane@yahoo.com        2017-06-20
Kim             kim@gmail.com         2017-06-10
Hong            hong@gmail.com        2016-06-25
Susan           Susan@gmail.com       2017-05-21

回答1:

This only applies to POSTGRES

You can use the ORDER_BY command to set your query set as ordered by date, then chain with the DISTINCT command to get distinct rows and specify which field. The DISTINCT command will take the first entry for each name. Refer The Docs For More

Edit

For MYSQL, you will have to use raw SQL queries, refer here



回答2:

Only Postgres supports providing field names in distinct. Also, any field provided in values and order_by is in distinct, thus providing ambiguous results sometimes.

However for MySQL:

Model.objects.values('names').distinct().latest('date')


回答3:

with postgresql you should able to do:

 EmailModel.objects.all().order_by('date').distinct('Name')

for more methods/functions like this, you can visit the docs here