2015-12-01 8 views
7

seguito this question, mi piacerebbe sapere se c'è qualche differenza per iscrittoNella dichiarazione del filtro Django qual è la differenza tra __in e segno di uguale (=)?

.filter(league_pk__in=[1,2,3]) 

e

.filter(league=[1,2,3]) 

Ho provato entrambi e sembra che restituire gli stessi risultati nel mio codice, ma in nessuna parte la documentazione dice che sono la stessa cosa (as with __exact).

Posso presumere che le due forme siano uguali? Dove è documentato?

+2

campionato è campo ManyToMany? – doniyor

risposta

5

Senza sapere quale sia la relazione definita sui modelli, non possiamo dirlo con certezza. Quello che posso darvi è un modo per controllare la query, che vi dirà di sicuro se sono equivalenti o no:

print your_qs.filter(league_pk__in=[1,2,3]).query 
print your_qs.filter(league=[1,2,3]).query 

E cerca nella SQL generato per vedere cosa sta realmente accadendo a livello di db.

+0

Ho usato questo metodo e ho visto che le query generate sono identiche, nonostante 'league' sia un ForeignKey. Forse ci sono alcuni casi in cui è diverso e alcuni dove è lo stesso? La tua risposta risolve ogni possibile ulteriore domanda, però. Grazie molto! – Saturnix

+0

Sto cercando di trovare un biglietto in cui questa "funzione" è stata aggiunta. Posso chiedere quale versione di django sei? Le versioni precedenti possono provare a convertire la lista [1,2,3] in numero intero e, naturalmente, falliscono qui. – wim

+0

Mi sono sbagliato. Non funziona se fornisci una lista (come ho fatto nella mia domanda): devi usare "__in" se fornisci una lista Python. Tuttavia, funziona se fornisci un Djery QuerySet. In questo caso, puoi utilizzare sia "__in" sia "=" e hanno lo stesso risultato. – Saturnix

0

Penso all'incirca per la tua prima domanda, che sta facendo:

SELECT * FROM model WHERE model.league_id IN (SELECT id FROM league WHERE id IN(1, 2, 3)) 

Per la seconda domanda, che sta facendo:

SELECT * FROM model WHERE model.league_id IN (1, 2, 3) 
Problemi correlati