Como faço para recuperar uma classe de modelo Django dinamicamente?

votos
20

Sem ter o caminho do módulo completo de um modelo de Django, é possível fazer algo como:

model = 'User' [in Django namespace]
model.objects.all()

... ao contrário:

User.objects.all().

EDIT: Eu estou tentando fazer esta chamada com base na entrada de linha de comando. É possível evitar a declaração de importação, por exemplo,

model = django.authx.models.User

Sem Django retornar o erro:

global name django is not defined.
Publicado 04/01/2009 em 23:32
fonte usuário
Em outras línguas...                            


6 respostas

votos
35

Eu acho que você está procurando para isso:

from django.db.models.loading import get_model
model = get_model('app_name', 'model_name')

Existem outros métodos, é claro, mas esta é a maneira que eu lidar com isso se você não sabe o que modelos de arquivo que você precisa para importação em seu namespace. (Nota não há realmente nenhuma maneira de obter com segurança um modelo sem primeiro saber o app que pertence. Olhe para o código fonte para loading.py se você quiser testar a sua sorte na iteração sobre todos os modelos dos aplicativos.)

Update: De acordo com o Django cronograma depreciação , django.db.models.loadingfoi substituído no Django 1.7 e será removida em Django 1.9. Como apontado na resposta de Alasdair , uma nova API para os modelos que carregam dinamicamente foi adicionado em Django 1.7.

Respondeu 05/01/2009 em 00:11
fonte usuário

votos
29

Para Django 1.7+, há um registro de aplicativos . Você pode usar o apps.get_modelmétodo para obter dinamicamente um modelo.

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
Respondeu 07/02/2015 em 09:19
fonte usuário

votos
3
from django.authx.models import User
model = User
model.objects.all()
Respondeu 04/01/2009 em 23:34
fonte usuário

votos
1

model = django.authx.models.User

? Django retorna um erro, "nome global Django não está definido."

O Django não retornar o erro. Python faz.

Primeiro, você deve importar o modelo. Você deve importá-lo com

from django.authx.models import User

Em segundo lugar, se você receber um erro que djangonão está definido, então o Django não está instalado corretamente. Você deve ter Django em seu PYTHONPATHou instalado em seus Python lib / site-packages.

Para instalar Django corretamente, consulte http://docs.djangoproject.com/en/dev/intro/install/#intro-install

Respondeu 05/01/2009 em 00:42
fonte usuário

votos
0

As aulas são objetos "primeira classe" em Python, o que significa que eles podem ser passadas ao redor e manipulados como todos os outros objetos.

Modelos são classes - você pode dizer a partir do fato de que você criar novos modelos usando declarações de classe:

class Person(models.Model):
    last_name = models.CharField(max_length=64)

class AnthropomorphicBear(models.Model):
    last_name = models.CharField(max_length=64)

Tanto o Persone AnthropomorphicBearidentificadores são obrigados a aulas de Django, para que possa passá-los ao redor. Isso pode útil se você quiser criar funções auxiliares que trabalham no nível do modelo (e compartilhar uma interface comum):

def print_obj_by_last_name(model, last_name):
    model_name = model.__name__
    matches = model.objects.filter(last_name=last_name).all()
    print('{0}: {1!r}'.format(model_name, matches))

Então print_obj_by_last_namevai trabalhar tanto com os Personou AnthropomorphicBearmodelos. Basta passar o modelo em como assim:

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')
Respondeu 05/01/2009 em 00:43
fonte usuário

votos
-2

Se você tiver o nome do modelo passado como uma string Eu acho que de uma maneira poderia ser

modelname = "User"
model = globals()[modelname]

Mas mucking com globals () pode ser um pouco perigoso em alguns contextos. Então, manusear com cuidado :)

Respondeu 04/01/2009 em 23:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more