2015-12-01 2 views
7

Po this question, chciałbym wiedzieć, czy istnieje jakakolwiek różnica w piśmieW instrukcji filtra Django jaka jest różnica między znakiem __in a znakiem równości (=)?

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

i

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

Próbowałem zarówno i wydają się takie same wyniki w moim kodu, ale nigdzie w w dokumentacji mówi się, że są to te same rzeczy (as with __exact).

Czy mogę bezpiecznie założyć, że te dwie formy są równe? Gdzie jest to udokumentowane?

+2

liga jest pole manytomany? – doniyor

Odpowiedz

5

Nie możemy powiedzieć na pewno, nie wiedząc, co relacja jest zdefiniowana w modelach. Co mogę ci dać to sposób by sprawdzić kwerendę, która będzie powiedzieć na pewno, czy są one równoważne lub nie:

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

i spojrzeć na SQL generowany, aby zobaczyć, co się rzeczywiście dzieje się na poziomie dB.

+0

Użyłem tej metody i zobaczyłem, że wygenerowane zapytania są identyczne, mimo że 'lig' jest obcym kluczem. Być może są przypadki, w których jest inaczej, a niektóre są takie same? Twoja odpowiedź rozwiązuje wszelkie możliwe dalsze pytania. Wielkie dzięki! – Saturnix

+0

Próbuję znaleźć bilet, w którym dodano tę "funkcję". Czy mogę zapytać, z której wersji django korzystasz? Wcześniejsze wersje mogą próbować przekonwertować listę [1,2,3] na liczbę całkowitą i, oczywiście, nie udać się tutaj. – wim

+0

Myliłem się. Nie działa, jeśli podajesz listę (tak jak w moim pytaniu): musisz użyć "__in", jeśli podasz listę w Pythonie. Jednak działa, jeśli podasz Django QuerySet. W takim przypadku możesz użyć zarówno "__in", jak i "=" i mają ten sam rezultat. – Saturnix

0

myślę grubsza do pierwszego zapytania, to robi:

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

Dla drugiego zapytania, to robi:

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