| 516 | Especifique um ou mais dos seguintes ``params``, ``select``, ``where`` ou ``tables``. Nenhum dos argumentos é requerido, mas você deve usar pelo menos um deles. |
| 517 | |
| 518 | ``select`` |
| 519 | The ``select`` argument lets you put extra fields in the ``SELECT`` clause. |
| 520 | It should be a dictionary mapping attribute names to SQL clauses to use to |
| 521 | calculate that attribute. |
| 522 | |
| 523 | Exemplo:: |
| 524 | |
| 525 | Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"}) |
| 526 | |
| 527 | |
| 528 | Como resultado, cada objeto ``Entry`` terá um atributo extra, ``is_recent``, uma representação booleana de ``pub_date`` de entrada é maior do que janeiro 1, 2006. |
| 529 | |
| 530 | Django insere o trecho SQL dado diretamente na declaração ``SELECT``, assim a SQL resultante do exemplo acima seria:: |
| 531 | |
| 532 | SELECT blog_entry.*, (pub_date > '2006-01-01') |
| 533 | FROM blog_entry; |
| 534 | |
| 535 | |
| 536 | O exemplo seguinte é mais avançado; faz uma subquery para dar a cada objeto ``Blog`` resultante um atributo ``entry_count``, um inteiro da contagem de objetos associados da ``Entry``:: |
| 537 | |
| 538 | Blog.objects.extra( |
| 539 | select={ |
| 540 | 'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id' |
| 541 | }, |
| 542 | ) |
| 543 | |
| 544 | (Neste caso particular, nós estamos abusando do fato que a query já conterá a tabela ``blog_blog`` no sua cláusula ``FROM`` .) |
| 545 | |
| 546 | O SQL resultante do exemplo acima seria:: |
| 547 | |
| 548 | SELECT blog_blog.*, (SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id) |
| 549 | FROM blog_blog; |
| 550 | |
| 551 | Note que o parênteses requerido pela maioria dos engines de banco de dados ao redor das subqueries não são requeridos nas cláusulas ``select`` do Django . Note também que alguns backends de banco de dados , como algumas versões de MySQL, não suportam subqueries. |
| 552 | |
| 553 | ``where`` / ``tables`` |
| 554 | Você pode definir as cláusulas SQL ``WHERE`` explícitamente -- talvez para executar joins não-explícitos -- usando ``where``. Pode também manualmente adicionar tabelas a cláusula SQL ``FROM`` usando ``tables``. |
| 555 | |
| 556 | ``where`` e ``tables`` ambos levam uma lista de strings. Todos parâmetros ``where`` são adicionados de "AND" para qualquer outro critério de busca. |
| 557 | |
| 558 | Exemplo:: |
| 559 | |
| 560 | Entry.objects.extra(where=['id IN (3, 4, 5, 20)']) |
| 561 | |
| 562 | ...traduz (aproximadamente) na seguinte SQL:: |
| 563 | |
| 564 | SELECT * FROM blog_entry WHERE id IN (3, 4, 5, 20); |
| 565 | |
| 566 | |
| 567 | ``params`` |
| 568 | Os parâmetros ``select`` e ``where`` descritos acima podem usar o padrão de placeholders de string para banco de dados do Python -- ``"%s"`` para indicar parâmetros que o engine de banco de dados deve adicionar automaticamente aspas. O argumento ``params`` é uma lista de todos os parâmetros extra a serem substituídos. |
| 569 | |
| 570 | |
| 571 | Exemplo:: |
| 572 | |
| 573 | Entry.objects.extra(where=['headline=%s'], params=['Lennon']) |
| 574 | |
| 575 | Sempre use ``params`` em vez de encaixar valores diretamente em ``select`` ou ``where`` porque os ``params`` assegurarão que os valores sejam adcionados de aspas corretamente de acordo com seu backend. (Por exemplo, as aspas serão escapadas corretamente.) |
| 576 | |
| 577 | Ruim:: |
| 578 | |
| 579 | Entry.objects.extra(where=["headline='Lennon'"]) |
| 580 | |
| 581 | Bom:: |
| 582 | |
| 583 | Entry.objects.extra(where=['headline=%s'], params=['Lennon']) |
| 584 | |