2013-11-14 9 views
7

Obserwowałem to zachowanie i nie do końca rozumiem. Powiedzmy robię zapytanie:Django: sprawdź, czy wartość w values_list z & bez prefetch_related/select_related

result = model.objects.all() 
result_pks = result.values_list("id",flat=True) 
print result_pks 

I otrzymujemy:

[1,2,3,4] 

Następnie chcę, aby sprawdzić, czy dany stosunek jest na liście pks powrócił:

val = 2 
print val in result_pks 

ten zwróci True, ale jeśli zamiast tego zmienię wynik na:

result = model.objects.prefetch_related("related_field").all() 
result_pks = result.values_list("id",flat=True) 
print result_pks 

wciąż otrzymuję:

[1,2,3,4] 

Ale kiedy zrobić:

val=2 
print val in result_pks 

uzyskać False. Próbowałem używać select_related zamiast tego, i który zwrócił True, jak się spodziewałem. Czy ktoś może mi wyjaśnić, dlaczego różnica?

+0

Jakiej wersji Django używasz? –

Odpowiedz

7

Czy używasz Django 1.5?

Wystąpił błąd, który powodował niepowodzenie wyszukiwania in podczas korzystania z prefetch_related: bug 20242.

Zostało to naprawione w Django 1.6.

+0

Tak więc poprawką może być 'print val in list (result_pks)' – karthikr

+0

Dzięki. Używam wersji 1.4 z powodu GAE – CoffeeJack

+0

@CoffeeJack: nie jestem pewien, kiedy błąd został wprowadzony, ale może być również w Django 1.4. –

Powiązane problemy