Как я получаю класс модели Django динамично?

Расширение Swift 3 для UIWindow

public extension UIWindow {

  func capture() -> UIImage? {

    UIGraphicsBeginImageContextWithOptions(self.frame.size, self.isOpaque, UIScreen.main.scale)
    self.layer.render(in: UIGraphicsGetCurrentContext()!)
    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image

  }
}]
26
задан Daniel Naab 15 September 2011 в 04:42
поделиться

5 ответов

Я думаю, что Вы ищете это:

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

существуют другие методы, конечно, но это - способ, которым я обработал бы его, если Вы не знаете, какой файл моделей необходимо импортировать в пространство имен. (Примечание нет действительно никакого способа безопасно получить модель без первого знания, какому приложению это принадлежит. Посмотрите на исходный код к loading.py, если Вы хотите протестировать свою удачу при итерации по моделям всех приложений.)

Обновление для Django 1.7 +: По словам Django временная шкала депрекации , django.db.models.loading была удержана от использования в Django 1.7 и будет удалена в Django 1.9. Как указано в ответ Alasdair , В Django 1.7 +, существует реестр приложений. Можно использовать apps.get_model метод для динамичного получения модели:

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
42
ответ дан Blairg23 28 November 2019 в 06:13
поделиться
from django.authx.models import User
model = User
model.objects.all()
3
ответ дан 28 November 2019 в 06:13
поделиться

модель = django.authx.models. Пользователь

? Django возвращает ошибку, "глобальное имя django не определяется".

Django не возвращает ошибку. Python делает.

Первый, НЕОБХОДИМО импортировать модель. Необходимо импортировать его с

from django.authx.models import User
119-секундный, если Вы получаете ошибку, которая django не определяется, тогда Django не установлен правильно. У Вас должен быть Django на Вашем PYTHONPATH или установленный в Вашем Python lib/site-packages.

Для установки Django правильно см. http://docs.djangoproject.com/en/dev/intro/install/#intro-install

1
ответ дан S.Lott 28 November 2019 в 06:13
поделиться

Классы являются объектами "первого класса" в Python, означая, что они могут раздаваться и управляться точно так же, как все другие объекты.

Модели являются классами - можно сказать от того, что Вы создаете новые модели с помощью операторов класса:

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

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

И Person и AnthropomorphicBear идентификаторы связываются с классами Django, таким образом, можно раздать их. Это может полезный, если Вы хотите создать функции помощника, которые работают на образцовом уровне (и совместно используют единый интерфейс):

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

Так print_obj_by_last_name будет работать или с Person или с AnthropomorphicBear модели. Просто передайте модель в подобном так:

print_obj_by_last_name(model=Person, last_name='Dole')
print_obj_by_last_name(model=AnthropomorphicBear, last_name='Fozzy')
0
ответ дан cdleary 28 November 2019 в 06:13
поделиться

Если Вам передали имя модели как строку, я предполагаю, что один путь мог бы быть

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

, Но слоняющийся без дела с globals () могло бы быть немного опасным в некоторых контекстах. Так обращаться с осторожностью:)

-2
ответ дан Hannes Ovrén 28 November 2019 в 06:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: