| 172 | Recuperando objetos |
| 173 | =================== |
| 174 | |
| 175 | Para recuperar objetos de seu banco de dados, você constrói um ``QuerySet`` através de um ``Manager`` (gerente) em sua classe de modelo. |
| 176 | |
| 177 | Um ``QuerySet`` representa uma coleção dos objetos em seu banco de dados. Pode ter zero, um ou muitos *filtros* (filters) --critérios que reduzem, estreitam a coleção baseando-se em parâmetros fornecidos. Em termos SQL, um ``QuerySet`` equivale a uma declaração ``SELECT``, e um filtro uma cláusula condicional como ``WHERE`` ou ``LIMIT``. |
| 178 | |
| 179 | Você obtém um ``QuerySet`` usando o ``Manager`` dos seus modelos (models class). Cada modelo tem pelo menos um ``Manager``, e é chamado ``objects`` por padrão. Acesse-o diretamente através das classes modelos (models classes), dessa maneira:: |
| 180 | |
| 181 | Blog.objects # <django.db.models.manager.Manager object at ...> |
| 182 | b = Blog(name='Foo', tagline='Bar') |
| 183 | b.objects # AttributeError: "Manager isn't accessible via Blog instances." |
| 184 | |
| 185 | (``Managers`` são acessívei somente por via das classes modelos, e não pelas instâncias dos modelos, isto é para garantir a separação entre operações em níveis de tabelas ("table-level") das operações em níveis de registro ("record-level") ) |
| 186 | |
| 187 | O ``Manager`` é a principal fonte de ``QuerySets`` para um determinado modelo (model). Ele age como uma "raiz" das ``QuerySet`` que descrevem todos os objetos em tabelas de um determinado modelo no banco de dados. |
| 188 | Por exemplo, ``Blog.objects`` é a ``QuerySet`` inicial que contém todos os objetos ``Blog`` no banco de dados. |
| 189 | |
| 190 | |
| 191 | |
| 192 | Recuperando todos objetos |
| 193 | ------------------------- |
| 194 | |
| 195 | A maneira a mais simples de recuperar objetos de uma tabela é recuperá-los todos de uma vez.. Para fazer isto, use o método ``all()`` em um ``Manager``. |
| 196 | |
| 197 | Exemplo:: |
| 198 | |
| 199 | all_entries = Entry.objects.all() |
| 200 | |
| 201 | O método ``all()`` retorna um ``QuerySet`` de todos os objetos no banco de dados. |
| 202 | |
| 203 | (Já que ``Entry.objects`` é um ``QuerySet``, porque nós não podemos utilizar ``Entry.objects``? |
| 204 | Isto ocorre porque ``Entry.objects``, que é a ``QuerySet`` raíz , é um caso especial que não pode ser avaliado. O método ``all()`` retorna um ``QuerySet`` que *pode* ser avaliado.) |
| 205 | |
| 206 | Filtrando objetos |
| 207 | ----------------- |
| 208 | |
| 209 | A``QuerySet`` raíz que é fornecida pelo ``Manager`` descreve todos os objetos de um tabela no banco de dados. Embora usualmente, você tenha que escolher somente parte (subset) do completo conjunto de objetos |
| 210 | |
| 211 | Para criar tal parte do conjunto, você refina a ``QuerySet`` inicial, adicionando condições como filtros. As duas maneiras mais comuns para refinar um ``QuerySet`` são: |
| 212 | |
| 213 | ``filter(**kwargs)`` |
| 214 | Retorna um novo``QuerySet`` contendo objetos que casam com o determinado parâmetro de busca |
| 215 | |
| 216 | ``exclude(**kwargs)`` |
| 217 | Retorna um novo``QuerySet`` contendo objetos que *não* casam com o determinado parâmetro de busca |
| 218 | |
| 219 | Os parâmetros de busca (``**kwargs`` nas funções definidas acima) devem estar no format descrito abaixo em `Field lookups`_. |
| 220 | |
| 221 | .. _`Field lookups`: http://www.djangoproject.com/documentation/db_api/#field-lookups |
| 222 | |
| 223 | Por exemplo, para obter um ``QuerySet`` das entradas de um blog desde o ano de 2006, use ``filter()`` dessa forma:: |
| 224 | |
| 225 | Entry.objects.filter(pub_date__year=2006) |
| 226 | |
| 227 | (Note que não temos que adicionar um ``all()`` -- ``Entry.objects.all().filter(...)``. Isto também deve funcionar, porém você somente precisa usar ``all()`` quando você quiser todos os objetos da ``QuerySet`` raíz.) |
| 228 | |
| 229 | Filtros encadeados |
| 230 | ------------------ |
| 231 | |
| 232 | O resultado do refinamento de uma ``QuerySet`` é também um ``QuerySet``, assim é possível encadear outros refinamentos. Por exemplo:: |
| 233 | |
| 234 | Entry.objects.filter( |
| 235 | headline__startswith='What').exclude( |
| 236 | pub_date__gte=datetime.now()).filter( |
| 237 | pub_date__gte=datetime(2005, 1, 1)) |
| 238 | |
| 239 | ...observe o ``QuerySet`` inicial com todas entradas contidas no banco de dados, incluia 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. |
| 240 | |
| 241 | |