O que é choice_set neste tutorial do aplicativo Django?

144

Existe esta linha no tutorial do Django, Escrevendo seu primeiro aplicativo Django, parte 1 :

p.choice_set.create(choice='Not much', votes=0)

Como é choice_setchamado à existência e o que é?

Suponho que a choicepeça seja a versão em minúscula do modelo Choiceusado no tutorial, mas o que é choice_set? Você pode elaborar?

ATUALIZAÇÃO: Com base na resposta de Ben , localizei esta documentação: Seguindo os relacionamentos "atrasados" .

Peter Mortensen
fonte
Eu deveria ter apenas ligado a essa documentação, é mais claro que a minha resposta.
Ben James
@ Ben James: não, eu aprecio tê-lo formulado de uma maneira diferente, especialmente a elaboração do que o ORM está fazendo. A documentação do Django pode ser concisa às vezes.
Peter Mortensen
40
Obrigado por perguntar, fiquei confuso com isso, pois eles não explicam isso no tutorial.
21413
4
Uau, essa é uma linha de código carregada para um novato. Para mim, o obstáculo era entender que estamos recebendo um Objeto de Escolha, relacionado à Pergunta, a fim de incrementá-lo. O conceito RelatedManager não foi mencionado no tutorial até este ponto, portanto pode ser um verdadeiro obstáculo.
frozenjim
@PeterMortensen, você pode atualizar a documentação onde está descrita? obrigado
MH

Respostas:

178

Você criou uma chave estrangeira na Choicequal relaciona cada uma a um Question.

Portanto, cada Choiceum possui explicitamente um questioncampo que você declarou no modelo.

O ORM do Django também segue o relacionamento de trás para frente Question, gerando automaticamente um campo em cada instância chamada foo_setwhere Foois the model com um ForeignKeycampo para esse modelo.

choice_seté um RelatedManagerque pode criar conjuntos de consultas de Choiceobjetos relacionados à Questioninstância, por exemploq.choice_set.all()

Se você não gostar da foo_setnomeação escolhida automaticamente pelo Django, ou se tiver mais de uma chave estrangeira para o mesmo modelo e precisar diferenciá-las, poderá escolher seu próprio nome de substituição usando o related_nameargumento para ForeignKey.

Ben James
fonte
Obrigado. Eu sei muito mais agora. O choice_set não é um "Gerente"? (que pode retornar uma instância da classe QuerySet). Ou é a mesma coisa?
Peter Mortensen
2
Você está correto, é um RelatedManagerque pode criar conjuntos de consultas.
Ben James