Django orm get latest for each group

前端 未结 4 1809
青春惊慌失措
青春惊慌失措 2020-11-27 15:12

I am using Django 1.6 with Mysql.

I have these models:

class Student(models.Model):
     username = models.CharField(max_length=200, unique = True)

         


        
相关标签:
4条回答
  • 2020-11-27 15:52

    Here's an example using Greatest with a secondary annotate. I was facing and issue where annotate was returning duplicate records ( Examples ), but the last_message_time Greatest annotation was causing duplicates.

    qs = (
                Example.objects.filter(
                    Q(xyz=xyz)
                )
                .exclude(
                     Q(zzz=zzz)
                )
                # this annotation causes duplicate Examples in the qs
                # and distinct doesn't work, as expected
                # .distinct('id') 
                .annotate(
                    last_message_time=Greatest(
                        "comments__created",
                        "files__owner_files__created",
                    )
                )
                # so this second annotation selects the Max value of the various Greatest
                .annotate(
                    last_message_time=Max(
                        "last_message_time"
                    )
                )
                .order_by("-last_message_time")
        )
    
    

    reference:

    • https://docs.djangoproject.com/en/3.1/ref/models/database-functions/#greatest
    • from django.db.models import Max
    0 讨论(0)
  • 2020-11-27 15:57

    This should work on Django 1.2+ and MySQL:

    Score.objects.annotate(
      max_date=Max('student__score__date')
    ).filter(
      date=F('max_date')
    )
    
    0 讨论(0)
  • 2020-11-27 15:59

    If your DB is postgres which supports distinct() on field you can try

    Score.objects.order_by('student__username', '-date').distinct('student__username')
    
    0 讨论(0)
  • 2020-11-27 16:03

    I believe this would give you the student and the data

    Score.objects.values('student').annotate(latest_date=Max('date'))
    

    If you want the full Score records, it seems you will have to use a raw SQL query: Filtering Django Query by the Record with the Maximum Column Value

    0 讨论(0)
提交回复
热议问题