Как создать связь между двумя базами данных в Django 2.2 ORM (одна неуправляемая и одна управляемая) - PullRequest
0 голосов
/ 08 мая 2019

У меня есть две модели:

  1. ciad_db - MySQL, неуправляемый
class NormalizedData(models.Model):
    ticket_number = models.CharField(max_length=100, blank=True, primary_key=True, default='noticketid')
    status = models.CharField(max_length=45, blank=True, null=True)
    ticket_source = models.CharField(max_length=45, blank=True, null=True)
    summary = models.TextField(blank=True, null=True)
    conclusion = models.ForeignKey(DsrConclusions, on_delete=models.CASCADE, default=None)

    class Meta:
        managed = False
        db_table = 'normalized_data'
        indexes = [
            models.Index(
                fields=[
                    'status',
                    'ticket_source',
                    'summary',
                ]
            )
        ]
  1. default - sqlite3, управляемый
class DsrConclusions(models.Model):
    id = models.IntegerField(primary_key=True)
    ticket_number = models.CharField(max_length=100, blank=False, null=False, unique=True)
    explanation = models.TextField(blank=False, null=False)
    final_breach_conclusion = models.BooleanField(blank=False,null=False)
    last_owner = models.CharField(blank=False,null=False, max_length=50)

    class Meta:
        managed = True
        indexes = [
            models.Index(
                fields=[
                    'ticket_number',
                    'explanation',
                    'final_breach_conclusion',
                    'last_owner',
                ]
            )
        ]

в models.py, DsrConclusions предшествует NormalizedData

Я использую маршрутизатор базы данных из-за двух баз данных, которые выглядят так:

class CiadRouter(object):
    """
    A router to control all database operations on models in
    the ciadseeweb application
    """

    def db_for_read(self, model, **hints):
        """
        Point all operations on ciadseeweb models to 'ciad_db'
        """
        if model._meta.app_label == 'ciadseeweb':
            return 'ciad_db'
        return None

    def db_for_write(self, model, **hints):
        """
        Point all operations on myapp models to 'other'
        """
        if model._meta.app_label == 'ciadseeweb':
            return 'default'
        return None

    def allow_syncdb(self, db, model):
        """
        Make sure the 'ciadseeweb' app only appears on the 'other' db
        """
        if db == 'ciad_db':
            return model._meta.app_label == 'ciadseeweb'
        elif model._meta.app_label == 'ciadseeweb':
            return False
        return None
    def allow_relation(self, obj1, obj2, **hints):
        """
        Relations between objects are allowed if both objects are
        in the primary/replica pool.
        """
        db_list = ('default', 'ciad_db')
        if obj1._state.db in db_list and obj2._state.db in db_list:
            return True
        return None

Поскольку я добавил столбец после выполнения миграции (и все работает нормально), как только я добавляю столбец и запускаю makemigrations, я получаю No changes detected, потому что NormalizedData неуправляем. Затем я изменяю его на управляемый, снова запускаю makemigrations и получаю их для обнаружения изменений Как только я запускаю migrate, они применяются просто отлично.

Когда я запускаю сервер (который запускается без ошибок) и обновляю страницу, на которой я рендерим данные NormalizedData, в таблицу django-tables2 с таблицей django_tables2_column_shifter.

Чтобы получить данные из модели DsrConclusions в tables.py, которая отрисовывается из модели NormalizedData. Я использую dsr_review = tables.Column(verbose_name='DSR SLA', accessor='dsrconclusions.final_breach_conclusion'), как указано в документации django-tables2.

Я получаю: django.db.utils.OperationalError: (1054, "Unknown column 'normalized_data.conclusion_id' in 'field list'")

Я застрял. Что я делаю неправильно?! Это вообще возможно?

Окружающая среда

Package Name    Version
Django      2.2
Python      3.7.2
Crispy_Forms    1.7.2
Debug Toolbar   1.11
Django_Tables2  2.0.6
Django_Tables2_Column_Shifter   0.5.2
...