2015-02-23 2 views
0

У меня есть проект Django, где мне нужно использовать старые базы данных и источник базы данных между страницами. Оба они имеют одинаковые имена таблиц и имена полей, но загружаются разными данными.Django Использование нескольких моделей с одинаковыми именами таблиц и полей?

Теперь это настоящие модели, которые уже загружены данными, поэтому я не могу начать с нуля и создавать две модели с уникальными именами.

Вопрос есть. Могу ли я иметь несколько моделей с одинаковыми именами таблиц? Как отличить их от своих models.py?

Затем, как мне сообщить Django в моей модели view.py, какую модель использовать, если у них одинаковое имя таблицы и одинаковые имена полей? Кстати, каждый взгляд будет использовать одну или другие модели, поэтому мне не нужно использовать оба одновременно.

Старый DB:

class Business(models.Model): 
    name = models.CharField(max_length=50, ... 
    city = models.ForeignKey('City', ... 
    state = models.CharField(... 
    zipcode = models.CharField(... 

New DB:

class Business(models.Model): 
    name = models.CharField(max_length=50, ... 
    city = models.ForeignKey('City', ... 
    state = models.CharField(... 
    zipcode = models.CharField(... 
+0

Являются ли они * точно такими же? Проверьте рамки сайтов – Alvaro

+0

Другим способом является определение разных БД в файле settings.py: https://docs.djangoproject.com/en/1.7/topics/db/multi-db/ – Alvaro

+0

@Alvaro. То же самое, У меня есть реализованная инфраструктура сайтов, но она работает в одном домене, поэтому я не уверен, что инфраструктура сайтов будет с этим делать. Можете быть более конкретными? – WayBehind

ответ

2

После обсуждения, я пришел с этой идеей:

1) Изменив DATABASES, чтобы указать двух разных БД. Вы можете это проверить here

2) Измените определение модели, чтобы включить обе версии, и укажите одну и ту же таблицу. Тестирование с версией 1.7, Джанго игнорировать это в проверке модели, но быть очень осторожны с миграциями:

class OldBusiness(models.Model): 

    class Meta: 
     db_table = 'business_business' 

    name = models.CharField(max_length=50, ... 
    city = models.ForeignKey('City', ... 
    state = models.CharField(... 
    zipcode = models.CharField(... 


class Business(models.Model): 

    class Meta: 
     db_table = 'business_business' 

    name = models.CharField(max_length=50, ... 
    city = models.ForeignKey('City', ... 
    state = models.CharField(... 
    zipcode = models.CharField(... 

3) замещают диспетчер объектов, чтобы убедиться, что вы используете правильный дб для любого запроса:

class OldManager(models.Manager): 

    def get_queryset(self, *args, **kwargs): 
     return super(OldManager, self).get_queryset(*args, **kwargs).using('old') 


class OldBusiness(models.Model): 

    class Meta: 
     db_table = 'business_business' 

    objects = OldManager() 
    name = models.CharField(max_length=50, ... 
    city = models.ForeignKey('City', ... 
    state = models.CharField(... 
    zipcode = models.CharField(... 

Этот должен сделать это для большинства практических случаев, но если вы обновляете, вам придется учитывать другие вещи.

Как примечание: это предполагает, что вы оставили новую базу данных в ключе «по умолчанию» в БАЗ Dict

очень хорошее улучшение было бы реализовать database router для модели OldBusiness

You может даже проверить имя модели и вернуть старый db в этом случае. Очень чистый и будет работать с миграциями

+0

еще раз спасибо за вашу помощь. Я определенно попробую этот подход. Кстати, старая БД является БД по умолчанию, и приложение работает на Django 1.6, если это имеет значение. Еще раз спасибо! – WayBehind

Смежные вопросы