241 | | |
| 241 | QuerySets filtrados são únicos |
| 242 | ------------------------------ |
| 243 | |
| 244 | Cada vez que você refina um ``QuerySet``, você recebe um novo ``QuerySet`` que de nenhuma maneira limita (influencía) o ``QuerySet`` anterior. Cada refinamento cría um ``QuerySet`` separado e distinto que pode ser armazenado, usado e reutilizado. |
| 245 | |
| 246 | Exemplo:: |
| 247 | |
| 248 | q1 = Entry.objects.filter(headline__startswith="What") |
| 249 | q2 = q1.exclude(pub_date__gte=datetime.now()) |
| 250 | q3 = q1.filter(pub_date__gte=datetime.now()) |
| 251 | |
| 252 | Estes três ``QuerySets`` estão separados. O primeiro é um ``QuerySet`` base contendo todas as entradas que possuem um cabeçalho (headline) que começa com ?What?. O segundo é um subconjunto do primeiro, com critérios adicionais que exclui os registros cujo ``pub_date`` são maiores do que a data atual. O terceiro é um subconjunto do primeiro, com critérios adicionais que selecionam somente os registros cujo ``pub_date`` são maiores que a data atual. O ``QuerySet`` inicial (``q1``) não é afetado pelo processo do refinamento. |
| 253 | |
| 254 | QuerySets são preguiçosas |
| 255 | ------------------------- |
| 256 | |
| 257 | ``QuerySets`` são preguiçosas -- o ato de criar um ``QuerySet`` não envolve nenhuma atividade no banco de dados. Você pode utlizar filtros e mais filtros durante todo o dia e Django não rodará uma só query até que o ``QuerySet`` seja *assimilado*. |
| 258 | |
| 259 | |
| 260 | Quando QuerySets são avaliados |
| 261 | ------------------------------ |
| 262 | |
| 263 | Você pode avaliar um ``QuerySet`` nas seguintes situações: |
| 264 | |
| 265 | * **Iteration.** O ``QuerySet`` é iterativo, e executa sua query no banco de dados na primeira vez que você itera sobre ele. Por exemplo, isto imprimirá o cabeçalho (headline) de todas as entradas no banco de dados:: |
| 266 | |
| 267 | for e in Entry.objects.all(): |
| 268 | print e.headline |
| 269 | |
| 270 | * **Slicing.** Como explicado em `Limitando QuerySets`_ logo abaixo, um ``QuerySet`` pode ser dividido em parcelas, usando a sintaxe para extrair parcelas de array do Python. Geralmente cortar (extrair uma parcela) um ``QuerySet`` retorna outro (não avaliado / unevaluated) ``QuerySet``, mas Django executará a query no banco de dados se você usar o parâmetro ?step? da sintaxe de extrair parcelas. |
| 271 | |
| 272 | * **repr().** Um ``QuerySet`` está avaliado quando você chama ``repr()`` nele. Isto é para a conveniência do interpretador interativo do Python, assim você pode imediatamente ver seus resultados ao usar a API interativamente. |
| 273 | |
| 274 | * **len().** Um ``QuerySet`` está avaliado quando você chamada ``len()`` nele. Isto, como é de se esperar, retorna o comprimento da lista resultante. |
| 275 | |
| 276 | Nota: *Nào* use ``len()`` em ``QuerySet``\s se tudo que você quer fazer for determinar o número dos registros no conjunto. É muito mais eficiente manipular uma contagem no nível de banco de dados, usando SQL ``SELECT CONT(*)``, e Django fornece um método ``cont()`` precisamente por esta razão. Ver o ``cont()`` abaixo. |
| 277 | |
| 278 | * **list().** Força ser avaliado um ``QuerySet`` chamando``list()`` nele. Por exemplo:: |
| 279 | |
| 280 | entry_list = list(Entry.objects.all()) |
| 281 | |
| 282 | Contudo esteja ciente, isto pode causar um grande overhead de memória, porque Django carregará cada elemento da lista na memória. Por sua vez, iterar sobre um``QuerySet`` tomará vantagem de seu banco de dados para carregar dados e instanciar objetos somente quando você os necessita. |
| 283 | |
| 284 | Limitando QuerySets |
| 285 | ------------------- |