несоответствие в get для нескольких баз данных?

#django #django-views

#django #django-представления

Вопрос:

Использую Django уже < 1 год, но этот для меня в новинку. Надеюсь, кто-нибудь?

Что я пытаюсь сделать, это прочитать объект Person из одной базы данных (только для чтения, минимальные данные о персонаже), чтобы заполнить мою базу данных (r / w, более подробная информация о персонаже).

У меня есть 2 модели в разных базах данных:

everyone.py : класс Person(модели.Модель): emplid = models.CharField(max_length=15,primary_key= True) … (другие поля удалены)

     class Meta:
        app_label = u'everyone'
        db_tablespace = u'everyone'
        db_table = u'people_names'
        managed = False
  

people.py:

класс Person (модели.Модель):
emplid = модели.CharField(max_length=11, db_column=’emplid’, primary_key=True)
… (другие поля удалены)

     class Meta:
        db_table = u'person'
        app_label = u'commons'
        db_tablespace = u'people'
  

Модель от 2-го лица — это моя база данных по умолчанию, поэтому # 1 — это «все.Person» и # 2 — это просто «Person».

Я пытался (view.py ):

 try:
    person = everyone.Person.objects.get(pk=emplid)
except everyone.Person.DoesNotExist: # person not found by "get"
    do some stuff
finally:
    do some other stuff
  

но django жалуется: глобальное имя ‘everybody’ не определено.

Если я заменю «Person» на «everyone.Person», этот код работает (но, конечно, я обращаюсь не к той базе данных.

Когда я делаю:

 person = everyone.Person.objects.get(pk=emplid)
  

в командной строке с неверным emplid оболочка корректно возвращает

 condition everyone.Person.DoesNotExist raised
  

Я могу обойти эту проблему, используя «filter» вместо «get», и разобраться с возвращаемым объектом QuerySet, но мне просто интересно, заметил ли это кто-нибудь еще и знает, как заставить «Get» работать в случае доступа к другой БД.

спасибо, Брайан

Ответ №1:

Ни пространства имен Python, ни несколько баз данных работают совсем не так.

Если вы определяете оба этих Person класса в одном models.py файл, тогда второй полностью переопределяет первый, а первый фактически не существует, насколько это касается Python.

Даже если бы оно существовало, вы бы не называли его как everyone.Person . Это было бы только в том случае, если бы вы определили это внутри модуля, называемого everyone.py , или если вы определили это в другом приложении и сделали from everyone import models as everyone .

Комментарии:

1. Извините, что не включил этот бит. Две модели находятся в разных файлах, everyone.py и people.py . Но ваш ответ дал мне ответ, который сработал! Если я добавлю в свой views.py : «из commons.everyone импортируйте Person как Bob», затем Bob. DoesNotExist не существует. Бинго, но я все еще говорю, что синтаксис нескольких баз данных должен работать, т. Е. «все. Человек. Не существует «.