Django order_by() filter with distinct()

后端 未结 4 1258
长发绾君心
长发绾君心 2020-12-14 05:53

How can I make an order_by like this ....

p = Product.objects.filter(vendornumber=\'403516006\')\\
                   .order_by(\'-created\').di         


        
相关标签:
4条回答
  • 2020-12-14 06:13

    In case you are hoping to use a separate field for distinct and order by another field you can use the below code

    from django.db.models import Subquery
    
    Model.objects.filter(
        pk__in=Subquery(
           Model.objects.all().distinct('foo').values('pk')
        )
    ).order_by('bar')
    
    0 讨论(0)
  • 2020-12-14 06:15

    I had a similar issue but then with related fields. With just adding the related field in distinct(), I didn't get the right results.

    I wanted to sort by room__name keeping the person (linked to residency ) unique. Repeating the related field as per the below fixed my issue:

    .order_by('room__name', 'residency__person', ).distinct('room__name', 'residency__person')
    

    See also these related posts:

    • ProgrammingError: when using order_by and distinct together in django
    • django distinct and order_by
    • Postgresql DISTINCT ON with different ORDER BY
    0 讨论(0)
  • 2020-12-14 06:26

    Based on your error message and this other question, it seems to me this would fix it:

    p = Product.objects.filter(vendornumber='403516006')\
                   .order_by('vendor__name', '-created').distinct('vendor__name')
    

    That is, it seems that the DISTINCT ON expression(s) must match the leftmost ORDER BY expression(s). So by making the column you use in distinct as the first column in the order_by, I think it should work.

    0 讨论(0)
  • 2020-12-14 06:33

    Just matching leftmost order_by() arg and distinct() did not work for me, producing the same error (Django 1.8.7 bug or a feature)?

    qs.order_by('project').distinct('project')
    

    however it worked when I changed to:

    qs.order_by('project__id').distinct('project')
    

    and I do not even have multiple order_by args.

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