Domanda

Sono abituato a scrivere le mie query SQL e sto cercando di abituarmi a tutta la cosa ORM che sembra essere così popolare al giorno d'oggi.

Ecco la domanda:

SELECT * FROM routes WHERE route_id IN (
    SELECT DISTINCT t.route_id FROM stop_times AS st 
    LEFT JOIN trips AS t ON st.trip_id=t.trip_id
    WHERE stop_id = %s
)

dove% s è un intero.

Sto usando ORM di default di Django. Qual è il modo più divinatorio di fare questo?

Alcune informazioni di sfondo: Il DB che sto utilizzando è da un GTFS (specifica del feed di Google Transit). Questa query si suppone per ottenere una lista di ogni route che passa attraverso un particolare stop, tuttavia informazioni collegando questi è nella tabella trips.

Questa query funziona bene per me, così l'unico motivo che sto chiedendo è quello di imparare.

Grazie!

È stato utile?

Soluzione

È probabilmente un po 'più facile da capire il modo appropriato per fare questo se si ha quello che si stava utilizzando per il Models in questione.

Sto assumendo qualcosa di simile a quanto segue, basato sulla specifica lei ha citato lavorando da:

class Route(models.Model):
    #bunch of stuff
    pass
class Stop(models.Model):
    #bunch of stuff
    stop_times = models.ManyToManyField(through=StopTime)
class StopTime(models.Model):
    trip = models.ForeignKey(Trip)
    stop = models.ForeignKey(Stop)
    # bunch of additional meta about this M2M table
    pass
class Trip(models.Model):
    route = models.ForeignKey(Route)
    # bunch of stuff

Se questo è il caso ... si dovrebbe essere in grado di fare qualcosa di simile

Route.objects.filter(trip__stop__id=my_stop_id)

per ottenere tutti gli oggetti Route che passano attraverso un dato Stop con un id chiave primaria uguale a my_stop_id, che sto assumendo è un intero secondo la vostra posta.

Mi scuso se la sintassi è un po 'fuori, come non ho bisogno di fare molti-a-molti che utilizzano un tavolo extra esplicito. Alcuni regolazione può anche essere necessario se si deve (o scegliere di) utilizzare il parametro related_name per eventuali le chiavi esterne o molti-a-molti-campo.

Altri suggerimenti

mi corregga se sbaglio, ma non credo che si può fare con Django ORM in un modo normale.

Non v'è alcun supporto subquery e con un normale unirsi sarebbe dipenderà dal vostro database se un netto potrebbe aiutare. Se si sta utilizzando Postgres di quanto si possa fare con questa patch: http://code.djangoproject.com/ticket / 6422

La query sarebbe qualcosa di simile a questo:

Route.objects.filter(stop_time__trips__stop_id=...).distinct('stop_time__route_id')
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top