Как объединить 3 модели существующих таблиц базы данных с определенным ключом столбца? - PullRequest
0 голосов
/ 21 сентября 2019

Я разрабатываю веб-приложение, используя Django REST в качестве бэкэнда и Angular в качестве внешнего интерфейса.

У меня есть устаревшая база данных (только для чтения), в которой есть 3 таблицы, которые я хочу объединить для получения всех необходимых мне данных.

По сути, я использую результат этогозапрос на автоматическое заполнение формы.Пользователь вводит в форму известный номер счетчика и затем нажимает кнопку, которая вытягивает в форму другую связанную информацию, сводя к минимуму ввод данных.

Упрощенные таблицы и поля базы данных

MeterNumber

  • bi_acct
  • bi_srv_loc_nbr
  • bi_mtr_nbr

Заказчик

  • bi_acct (присоединиться к таблице MeterNumber)
  • другие необходимые мне поля

ServiceLocation

  • bi_srv_loc_nbr (присоединиться кТаблица MeterNumber)
  • другие необходимые мне поля

Итак, как вы можете видеть, все эти таблицы могут объединяться в таблицу MeterNumber на основе полей bi_acct и bi_srv_loc_nbr.Я хочу иметь возможность сделать вызов REST на что-то вроде:

server/meter_number/123456

И тогда ответ JSON будет выглядеть примерно так:

{
    "bi_acct": 111111,
    "bi_srv_loc_nbr": 222222,
    "bi_mtr_nbr": 123456,
    "customer": [
        {
            "bi_acct": 111111,
            "needed_field": "... "
        }
    ],
    "service_location": [
        {
            "bi_srv_loc_nbr": 222222,
            "needed_field": "..."
        }
    ]
}

И этот ответ будет использоваться для автоматического-заполните форму.


Но как мне создать эти объединения и получить данные в ответе JSON?Могу ли я сделать это с помощью сериализаторов?

Модели:

class MeterNumber(models.Model):

    bi_acct = models.IntegerField(
        db_column='BI_ACCT')
    bi_srv_loc_nbr = models.IntegerField(
        db_column='BI_SRV_LOC_NBR'
    bi_mtr_nbr = models.IntegerField(
        db_column='BI_MTR_NBR', blank=True, null=True)

    class Meta:
        app_label = 'cis'
        db_table = 'MeterNumber'
        managed = False

    def __str__(self):
        return str(self.bi_acct)


class Customer(models.Model):

    bi_acct = models.IntegerField(
        db_column='BI_ACCT')

    other_fields = ... 

    class Meta:
        app_label = 'cis'
        db_table = 'Customer'
        managed = False

    def __str__(self):
        return str(self.bi_acct)


class ServiceLocation(models.Model):

    bi_srv_loc_nbr = models.IntegerField(
        db_column='BI_SRV_LOC_NBR')

    other_fields = ... 

    class Meta:
        app_label = 'cis'
        db_table = 'ServiceLocation'
        managed = False

    def __str__(self):
        return str(self.bi_acct)

Проще говоря, учитывая номер счетчика, я хочу присоединить таблицы Customer и ServiceLocation к MeterNumber.Это очень простое соединение SQL.

Любое руководство приветствуется!

Ответы [ 2 ]

1 голос
/ 21 сентября 2019

Я думаю, что вы должны использовать ForeignKeys, поэтому попробуйте изменить MeterNumber:

class MeterNumber(models.Model):
    bi_acct = models.ForeignKey('Customer')
    bi_srv_loc_nbr = models.ForeignKey('ServiceLocation')
    bi_mtr_nbr = models.IntegerField(
        db_column='BI_MTR_NBR', blank=True, null=True
    )
1 голос
/ 21 сентября 2019

К сожалению, лучшие практики ORM не дают гибкости SQL, no foreign key implies no joins, поэтому вам придется вернуться к необработанным запросам SQL, ниже приведен пример фрагмента.Измените запрос SQL в соответствии с вашими потребностями.

from django.db import connection

def my_custom_sql():
    cursor = connection.cursor()    
    cursor.execute("select * from Customer")
    row = cursor.fetchone()
    return row
...