Changes between Version 6 and Version 7 of DocPtDatabaseAPI


Ignore:
Timestamp:
Oct 12, 2006, 12:36:49 PM (18 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}}}
Back to Top