我正在开发一个web应用程序,使用Django REST作为后端,以角作为前端。
我有一个遗留数据库(只读),其中有3个表,我想将它们连接在一起,以获取我所需的所有数据。
基本上,我使用这个查询的结果来自动填充一个表单。用户将输入一个已知的表号到表单中,然后单击一个按钮将其他相关信息拉到表单中--最小化数据输入。
简化数据库表和字段
MeterNumber
客户
ServiceLocation
因此,如您所见,这些表都可以基于MeterNumber和bi_srv_loc_nbr字段连接到bi_acct表。我想打个休息电话给这样的人:
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)更简单地说,给定一个表号,我想将客户表和ServiceLocation表加入到MeterNumber中。这是一个非常简单的SQL联接。
如有任何指导,将不胜感激!
发布于 2019-09-21 14:24:29
不幸的是,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发布于 2019-09-21 16:30:06
我认为您应该使用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
)https://stackoverflow.com/questions/58040942
复制相似问题