thanks for the thorough reply! I now understand how to proceed. However, I'm not convinced that distinct shouldn't do this for me... but I understand this is a philosophical point, and I put my trust in the django developers to get it right (just like I do with the american government... )
On Dec 4, 9:24 pm, Malcolm Tredinnick <[EMAIL PROTECTED]> wrote: > On Thu, 2008-12-04 at 19:09 -0800, ryan wrote: > > For instance, I have two objects: > > 1) Blog > > 2) Entry with a ForeignKey to Blog, and a Date field titled DateAdded > > > Now, I want to list all my blogs, ordering by the most recent added > > entry. > > > I tried: > > blog.objects.all().sort_by('entry__dateAdded').distinct() > > > But the result was that is a given blog had more than 1 entry, then it > > shows up in the resulting queryset more than once. It appears distinct > > () is doing nothing in this case. > > The distinct() call is working correctly (you're right that it is > effectively doing nothing, wrong to say it "doesn't work"). The problem > is that you are ordering by something that has multiple values and each > value contributes one output row. There is nothing in your ordering > statement to say that the database should only use the *maximum* value > of dateAdded for each entry. The only reasonable way to interpret > ordering by multi-valued fields is to treat each one as generating a > different output row, since otherwise we might as well just pick one at > random (the SQL specification agrees with that interpretation by the way > -- which is why Django does it. Only MySQL allows effective ordering by > columns not in the output list in this case and it's very non-standard). > > Refer to the massive callout box in the documentation for distinct() for > a more SQL-specific > explanation:http://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct > > You could achieve the effect you're after by using extra(select=..., > order_by=...) to select the maximum date added value as an extra > column. > > Alternatively (and this would require some fairly deep poking into Query > internals, so probably not recommended) you could add some extra stuff > to the where-clause to say "where dateAdded = (Select max(dateAdded) > from ...)". Possible some extra(where="....") usage could get you most > of the way there on that one. > > Regards, > Malcolm --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Django users" group. To post to this group, send email to django-users@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/django-users?hl=en -~----------~----~----~----~------~----~------~--~---