2013-12-14 20 views
16

Come posso fare una order_by come questo ....Django order_by() filtro con distinti()

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

Il problema è che non ho più fornitori con lo stesso nome, e voglio solo l'ultima prodotto dal fornitore ..

Spero che abbia senso?

ho ottenuto questo errore DB:

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

risposta

23

In base al messaggio di errore e this other question, mi sembra questo potrebbe risolvere il problema:

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

Cioè, sembra che la DISTINCT ON espressione (s) deve corrispondere alle espressioni ORDER BY più a sinistra. Quindi, rendendo la colonna che usi in distinct come prima colonna nel order_by, penso che dovrebbe funzionare.

+4

Ma con questo metodo ordinerà per prima cosa il nome del fornitore e utilizzerà solo "creato" come ordine secondario. Il che significa che l'ordine "creato" sarà errato. https://docs.djangoproject.com/en/1.10/ref/models/querysets/#order-by –

+0

@Ness Quello che dici è vero. Ma non necessariamente rilevante. Sembra che l'OP non fosse interessato all'ordinamento di 'created'. Ha usato 'creato' non allo scopo di ordinare il risultato finale, ma per ottenere il record corretto per venditore. Sembra che l'ordine dei venditori non fosse importante nel caso d'uso dell'OP. In realtà non conosciamo il vero ordine previsto, è essenzialmente non specificato da OP. – janos

+0

Grazie, non è una cosa ovvia. – abcdn

4

La sola corrispondenza con left_ordine() arg e distinct() non ha funzionato per me, producendo lo stesso errore (errore Django 1.8.7 o una funzionalità)?

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

tuttavia ha funzionato quando ho cambiato a:

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

e non hanno nemmeno più args order_by.

+1

Questa è stata l'unica cosa che ha funzionato per me con Django 2.0.2 e PostgreSQL 10.1. Ho provato gli altri suggerimenti che coinvolgono l'ordine degli argomenti per 'order_by' e' distinct' e quelli non hanno risolto il problema. – thedboydguy

0

Ho avuto un problema simile ma poi con campi correlati. Con la sola aggiunta del campo correlato in distinct(), non ho ottenuto i risultati corretti.

ho voluto ordinare in base room__name mantenendo il person (collegata al residency) unico. Ripetendo il campo relativo come da sotto fissa il mio problema:

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

Vedi anche questi commenti: