-
-
Save MewX/e3e0d5808ee24064d63f8e44f2dc14f3 to your computer and use it in GitHub Desktop.
GROUP BY and Select MAX from each group in Django, 2 queries
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
given a Model with: | |
category = models.CharField(max_length=32, choices=CATEGORY_CHOICES) | |
pubdate = models.DateTimeField(default=datetime.now) | |
<other fields> | |
Fetch the item from each category with the latest pubdate. | |
''' | |
model_max_set = Model.objects.values('category').annotate(max_pubdate=Max('pubdate')).order_by() | |
q_statement = Q() | |
for pair in model_max_set: | |
q_statement |= (Q(category__exact=pair['category']) & Q(pubdate=pair['max_pubdate'])) | |
model_set = Model.objects.filter(q_statement) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
When a filter is applied to the
model_max_set
, but no data found. This one will return every records.A solution is to add filters on both
model_max_set
andmodel_set
.