Code

Changes between Version 6 and Version 7 of DocPtDatabaseAPI


Ignore:
Timestamp:
10/12/06 10:36:49 (8 years ago)
Author:
mario.caseiro at gmail.com
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • DocPtDatabaseAPI

    v6 v7  
    239239...observe o ``QuerySet`` inicial com todas entradas contidas no banco de dados, inclua um filtro, depois uma exclusão, e depois outro filtro. O resultado final é um ``QuerySet`` contendo todas as entradas que o cabeçalho (headline) começe com "What", que foram publicados entre 1 de janeiro de 2005 e a data atual. 
    240240 
    241  
     241QuerySets filtrados são únicos 
     242------------------------------ 
     243 
     244Cada 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 
     246Exemplo:: 
     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 
     252Estes 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 
     254QuerySets 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 
     260Quando QuerySets são avaliados 
     261------------------------------ 
     262 
     263Você 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 
     284Limitando QuerySets 
     285------------------- 
    242286 
    243287}}}