2013-12-14 16 views
16

Jak mogę dokonać order_by takiego ....Django order_by() filtr z odrębną()

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

Problem polega na tym, że mam wielu dostawców o tej samej nazwie, a chcę tylko najnowsze produkt przez sprzedawcę ..

Mam nadzieję, że to ma sens?

mam ten błąd DB:

SELECT DISTINCT ON expressions must match initial ORDER BY expressions LINE 1: SELECT DISTINCT ON ("search_vendor"."name") "search_product"...

Odpowiedz

23

Na podstawie komunikatu o błędzie i this other question, wydaje mi się, to byłoby to naprawić:

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

Oznacza to, że wydaje się, że wyrażenie DISTINCT ON (s) muszą pasować do najbardziej zewnętrznych po lewej stronie wyrażenia (-ów): ORDER BY. Przez uczynienie kolumny używanej w distinct jako pierwszej kolumnie w order_by, myślę, że powinna działać.

+4

Ale z tej metody będzie pierwsze zamówienie według nazwy dostawcy i użyje tylko "utworzonego" jako drugorzędnego porządku. Co oznacza, że ​​zamówienie według "utworzonego" będzie nieprawidłowe. https://docs.djangoproject.com/en/1.10/ref/models/querysets/#order-by –

+0

@Ness To, co mówisz, jest prawdą. Ale niekoniecznie istotne. Wygląda na to, że OP nie był zainteresowany zamawianiem przez "stworzony". Użył "utworzonego" nie w celu zamawiania końcowego wyniku, ale do uzyskania poprawnego zapisu na dostawcę. Wydaje się, że zamówienie dostawców nie było ważne w przypadku użycia PO. W rzeczywistości nie znamy prawdziwego zamawiania, w zasadzie nie jest ono określone przez OP. – janos

+0

Dziękuję, naprawdę nie oczywiste. – abcdn

4

Po prostu dopasowanie lewostronnie order_by() arg i distinct() nie działało dla mnie, powodując ten sam błąd (błąd Django 1.8.7 lub cechę)?

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

jednak to działało kiedy zmienione na:

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

a ja nawet nie mają wiele args order_by.

+1

To była jedyna rzecz, która działała dla mnie z uruchomieniem Django 2.0.2 i PostgreSQL 10.1. Próbowałem innych sugestii dotyczących dopasowywania kolejności argumentów dla 'order_by' i' distinct', a te nie rozwiązały problemu. – thedboydguy

0

Miałem podobny problem, ale potem z pokrewnymi polami. Po prostu dodając powiązane pole w distinct(), nie uzyskałem właściwych wyników.

Chciałem posortować według room__name, zachowując unikalną nazwę person (powiązaną z residency). Powtarzanie pokrewnej dziedzinie, jak na poniższym stałej mojego problemu:

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

Zobacz także te powiązane posty: