首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用特定的列键连接3种现有数据库表模型?

如何用特定的列键连接3种现有数据库表模型?
EN

Stack Overflow用户
提问于 2019-09-21 13:51:43
回答 2查看 93关注 0票数 0

我正在开发一个web应用程序,使用Django REST作为后端,以角作为前端。

我有一个遗留数据库(只读),其中有3个表,我想将它们连接在一起,以获取我所需的所有数据。

基本上,我使用这个查询的结果来自动填充一个表单。用户将输入一个已知的表号到表单中,然后单击一个按钮将其他相关信息拉到表单中--最小化数据输入。

简化数据库表和字段

MeterNumber

  • bi_acct
  • bi_srv_loc_nbr
  • bi_mtr_nbr

客户

  • bi_acct (连接到MeterNumber表)
  • 其他字段--我需要

ServiceLocation

  • bi_srv_loc_nbr (连接到MeterNumber表)
  • 其他字段--我需要

因此,如您所见,这些表都可以基于MeterNumber和bi_srv_loc_nbr字段连接到bi_acct表。我想打个休息电话给这样的人:

代码语言:javascript
复制
server/meter_number/123456

然后JSON的响应应该是这样的:

代码语言:javascript
复制
{
    "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响应中呢?我能用串行化器来做吗?

型号:

代码语言:javascript
复制
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)

更简单地说,给定一个表号,我想将客户表和ServiceLocation表加入到MeterNumber中。这是一个非常简单的SQL联接。

如有任何指导,将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2019-09-21 14:24:29

不幸的是,ORM的最佳实践并没有提供SQL、no foreign key implies no joins的灵活性,因此您将不得不回到原始SQL查询,下面是一个示例片段。根据需要修改SQL查询。

代码语言:javascript
复制
from django.db import connection

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

Stack Overflow用户

发布于 2019-09-21 16:30:06

我认为您应该使用ForeignKeys,所以请尝试更改MeterNumber:

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58040942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档