| 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 | ------------------- |