Какой подход лучше всего подходит для отображения таблиц унаследованных приложений, названных в честь лет в Django? - PullRequest
2 голосов
/ 19 сентября 2011

Лучше посмотреть, как выглядят имена таблиц:

  • 2009_articles
  • 2010_articles
  • 2011_articles
  • 2009_customers
  • 2010_customers
  • 2011_customers
  • 2009_invoices
  • 2010_invoices
  • 2011_invoices

Разработчики смоделировали какое-то разделение (задолго до того, как MySQL его поддерживал), но теперь это мешает любой попытке создать быстрый интерфейс, чтобы клиенты могли видеть свои счета и менять годы.

Через пару месяцев у меня получились следующие результаты:

  • Изменение Invoice._meta.db_table бесполезно, потому что любое другое отношение, выведенное ORM, будет неправильным

  • models.py не может получить переменные запроса

Вариант а: Используйте абстрактные модели, чтобы Invoice10 добавил meta.db_table = 2010 и наследовал от модели Invoice, а Invoice11 добавил meta.db_table = 2011, не DRY, хотя приложение не должно поддерживать более двух или трех лет одновременно, но я все равно придется проверить, если

Вариант b: Дублируем модели и меняем импорт по моим представлениям: если год == 2010: из моделей импорт Артикул 10 как Артикул

и т. Д.

Опция c: Динамические модели, упоминаемые в нескольких местах в сети, но зачем использовать 100% динамическую модель, когда мне просто нужна 1% часть динамической модели?

Опция d: Вау, просто схожу с ума после разочарования. А как насчет нескольких настроек базы данных и использования маршрутизатора?

Любая помощь будет высоко ценится.

Ответы [ 2 ]

1 голос
/ 20 февраля 2012

Вариант e: создать новые релевантные модели / структуру базы данных и выполнить импорт старых данных в новую структуру.

0 голосов
/ 15 марта 2013

Гадкий, но должен сообщить.

Я добился чего-то полезного, используя сигнал Django: class_prepared и ThreadLocal для получения сеанса:

from django.db.models.signals import class_prepared
from myapp.middlewares import ThreadLocal

apps = ('oneapp', 'otherapp',)

def add_table_prefix(sender, *args, **kwargs):
    if sender._meta.app_label in apps:
        request = ThreadLocal.get_current_request()
        try:
            year = request.session['current_year']
        except:
            year = settings.CURRENT_YEAR
        prefix = getattr(settings, 'TABLE_PREFIX', '')
        sender._meta.db_table = ('%s_%s_%s_%s') % (prefix, year, sender._meta.coolgest_prefix, sender._meta.db_table)

class_prepared.connect(add_table_prefix)

То же самое относится к одному классу модели, отображающему несколько идентичных таблиц базы данных (invoices_01_2013, invoices_02_2013, ...) в зависимости от того, какой месяц и год просматривает пользователь приложения.

Хорошо работает на производстве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...