QuerySet์ ์ธ์ ํ๊ฐ(evaluate)๋๋๊ฐ?!
- ์ฟผ๋ฆฌ์
์ ์ค์ ๋ก DB๋ฅผ hittingํ์ง ์๋๋ค
- ๊ทธ๋ผ ์ธ์ DB๋ฅผ hittingํ๋ ๊ฐ?!
- iteration
=> iteration์ ์ต์ด๋ก ์คํํ ๋ ํ๊ฐ๋จ
์๋์ ์ฝ๋๋ ์ฌ์ฉํ์ง ๋ง๊ฒ.
for e in Entry.objects.all():
print(e.headline)
- slicing
=> unevaluated๋ QuerySet์ ๋ฆฌํดํจ! slicingํ ๋ step ํ๋ผ๋ฏธํฐ๋ฅผ ์ฐ๋ฉด evaluateํ๋ฉด์ list๋ฅผ ๋ฐํ
- pickling/caching
=> ๊ฒฐ๊ณผ๋ฅผ db๋ก ๋ถํฐ ์ฝ์ด์ง
- repr()
=> repr()์ ํธ์ถํ ๋ evaluate ๋จ
์ด๋ interpreter ํ๊ฒฝ์์์ ํธ์๋ฅผ ์ ๊ณตํ๊ธฐ ์ํจ!
- len()
=> len()์ ํธ์ถํ ๋ evaluate ๋จ
record์ ๊ฐ์๋ฅผ ์ธ๊ณ ์ถ์ ์ฉ๋๋ก๋ผ๋ฉด! len๋ง๊ณ count ๋ฉ์๋๋ฅผ ์ฐ์ธ์
- list()
=> force evaluation of a QuerySet by calling list() on it.
entry_list = list(Entry.objects.all())
- bool()
=> boolean ๋ฌธ๋งฅ์ผ๋ก ์ฌ์ฉ๋, "bool(), or, and, if"์ ๊ฐ์ ๊ฑฐ๋ ์ธ ๋๋ evaluate๋จ
if Entry.objects.filter(headline="test"):
print("There is at least one Entry with the handle Test")
์กด์ฌ์ ๋ฌดํ ์ฒดํฌํ๊ณ ์ถ๋ค๋ฉด bool()๋์ exists() ๋ฉ์๋ ์ฐ์ผ!
Pickling QuerySets
pickle
: ํผํด ๋ชจ๋์ ํ์ด์ฌ ๊ฐ์ฒด ๊ตฌ์กฐ๋ฅผ serialize/de-serializeํ๊ธฐ ์ํ ๋ฐ์ด๋๋ฆฌ ํ๋กํ ์ฝ์ ๊ตฌํํ ๊ฒ์
https://docs.python.org/3/library/pickle.html#module-pickle
QuerySet์ ํผํดํ๋ฉด, ํผํด๋ง๋๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋๋ก ๊ฐ์ ํจ(force)
ํผํด๋ง์ ์บ์๋ ์ฟผ๋ฆฌ์
์ด ๋ฆฌ๋ก๋๋ ๋, ์บ์ฑ์ ํ๋ฆฌ์ปค์๋ก์ ๋ณดํต ์ฌ์ฉ๋จ
This means that when you unpickle a QuerySet, it contains the results at the moment it was pickled, rather than the results that are currently in the database.
Reference