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