Добавление случая, когда имя класса для объекта, используемого в структуре сущности, такое же, как имя класса для файла с кодировкой веб-формы.
Предположим, у вас есть веб-форма 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 ()
Я думаю, что вы ищете это:
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.
Для Django 1.7+ существует реестр приложений . Вы можете использовать метод apps.get_model
для динамического получения модели.
from django.apps import apps
MyModel = apps.get_model('app_label', 'MyModel')
Классы - это объекты «первого класса» в 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')
Если у вас есть имя модели, переданное как строка, я предполагаю, что одним из способов может быть
modelname = "User"
model = globals()[modelname]
. Но в некоторых контекстах может быть немного опасно с globals (). Поэтому обращайтесь с осторожностью:)
model = django.authx.models.User
? Django возвращает ошибку: «глобальное имя django не определено».
blockquote>Django не возвращает ошибку. Python делает.
Во-первых, вы ДОЛЖНЫ импортировать модель. Вы должны импортировать его с помощью
from django.authx.models import User
. Во-вторых, если вы получили сообщение об ошибке, которое
django
не определено, то Django установлен неправильно. У вас должен быть Django на вашемPYTHONPATH
или установлен в ваших пакетах lib / site Python.Чтобы правильно установить Django, см. http://docs.djangoproject.com/en/dev/ интро / установка / # интро установить
from django.authx.models import User
model = User
model.objects.all()