Преобразование строки, которая должна быть частью команды python в скрипте Python [duplicate]

Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.

Предположим, у вас есть веб-форма Contact.aspx, чей класс codebehind Свяжитесь с вами, и у вас есть имя объекта Contact.

Затем следующий код вызовет исключение NullReferenceException при вызове context.SaveChanges ()

Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line

Ради полноты класса DataContext

public class DataContext : DbContext 
{
    public DbSet Contacts {get; set;}
}

и класс сущности контакта. Иногда классы сущностей являются частичными классами, так что вы можете распространять их и в других файлах.

public partial class Contact 
{
    public string Name {get; set;}
}

Ошибка возникает, когда оба класса entity и codebehind находятся в одном и том же пространстве имен. Чтобы исправить это, переименуйте класс сущности или класс codebehind для Contact.aspx.

Причина. Я все еще не уверен в причине. Но всякий раз, когда какой-либо из классов сущностей расширяет System.Web.UI.Page, возникает эта ошибка.

Для обсуждения рассмотрим NullReferenceException в DbContext.saveChanges ()

21
задан Daniel Naab 15 September 2011 в 05:42
поделиться

6 ответов

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

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

Конечно, есть и другие методы, но я бы справился с этим, если вы не знаете, какие модели вы используете необходимо импортировать в ваше пространство имен. (Обратите внимание, что на самом деле нет способа безопасно получить модель, не зная, к какому приложению она принадлежит. Посмотрите исходный код на load.py, если вы хотите проверить свою удачу при итерации по всем моделям приложений.)

Обновление. Согласно временной шкале устаревания Django , django.db.models.loading устарел в Django 1.7 и будет удален в Django 1.9. Как указано в ответе Аласдайра , новый API для динамически загружаемых моделей был добавлен в Django 1.7.

35
ответ дан Community 25 August 2018 в 16:48
поделиться

Для Django 1.7+ существует реестр приложений . Вы можете использовать метод apps.get_model для динамического получения модели.

from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
31
ответ дан Alasdair 25 August 2018 в 16:48
поделиться

Классы - это объекты «первого класса» в 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 25 August 2018 в 16:48
поделиться

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

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

. Но в некоторых контекстах может быть немного опасно с globals (). Поэтому обращайтесь с осторожностью:)

-2
ответ дан Hannes Ovrén 25 August 2018 в 16:48
поделиться

model = django.authx.models.User

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

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

Во-первых, вы ДОЛЖНЫ импортировать модель. Вы должны импортировать его с помощью

from django.authx.models import User

. Во-вторых, если вы получили сообщение об ошибке, которое django не определено, то Django установлен неправильно. У вас должен быть Django на вашем PYTHONPATH или установлен в ваших пакетах lib / site Python.

Чтобы правильно установить Django, см. http://docs.djangoproject.com/en/dev/ интро / установка / # интро установить

1
ответ дан S.Lott 25 August 2018 в 16:48
поделиться
from django.authx.models import User
model = User
model.objects.all()
3
ответ дан user 25 August 2018 в 16:48
поделиться
Другие вопросы по тегам:

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