No Django, você pode especificar relacionamentos como:
author = ForeignKey('Person')
E, em seguida, internamente, ele deve converter a string "Person" no modelo Person
.
Onde está a função que faz isso? Eu quero usá-lo, mas não consigo encontrá-lo.
django
django-models
mpen
fonte
fonte
from django.apps import AppConfig
django.apps.apps.get_model(model_name)
. Os objetos AppConfig destinam-se a uma finalidade diferente e exigem que você crie uma instância do AppConfig para poder chamarget_model()
.django.db.models.loading
foi descontinuado no Django 1.7 ( removido em 1.9 ) em favor do novo sistema de carregamento de aplicativos .Django 1.7 docs nos dar o seguinte em vez disso:
fonte
apenas para quem fica preso (como eu):
app_name
devem ser listados usando aspas, assim comomodel_name
(ou seja, não tente importá-lo)get_model
aceita letras minúsculas ou maiúsculas 'model_name'fonte
A maioria das "strings" do modelo aparece como "appname.modelname", portanto, você pode usar essa variação em get_model
A parte do código Django que geralmente transforma essas cordas em um modelo é um pouco mais complexa Este partir de
django/db/models/fields/related.py
:Para mim, esse parece ser um bom argumento para dividir isso em uma única função no código principal. No entanto, se você souber que suas seqüências de caracteres estão no formato "App.Model", os dois forros acima funcionarão.
fonte
your_model = get_model(*your_string.rsplit('.', 1))
. Às vezes, o rótulo do aplicativo é um formato pontilhado; no entanto, o nome do modelo é sempre um identificador válido.apps.get_model
. "Como atalho, esse método também aceita um único argumento no formulárioapp_label.model_name
."A maneira abençoada de fazer isso no Django 1.7+ é:
Portanto, no exemplo canônico de todos os tutoriais de estrutura:
fonte
Caso não saiba em qual aplicativo seu modelo existe, você pode pesquisá-lo desta maneira:
Lembre-se de que o seu_model_name deve estar em minúsculas.
fonte
Não sei ao certo onde é feito no Django, mas você pode fazer isso.
Mapeando o nome da classe para a string via reflexão.
fonte
Outra versão com menos código para os preguiçosos. Testado no Django 2+
fonte
Aqui está uma abordagem menos específica do django para obter uma classe da string:
ou você pode usar importlib como mostrado aqui :
fonte
Solução 2020:
por seu exemplo:
por: Erro de importação: não é possível importar o nome get_model
fonte