将两个表的信息合并到一个Django模型中
我需要读取外部数据库的数据。我无法使用以下两个表修改表结构: 表1 主键 字段1 表2 主键 字段2 是否可以将这两个表合并为一个Django模型,如下所示: 型号: 主键 字段1 字段2 其他信息: 表2中条目的键是表1中条目的子集。因此,对于表2中的任何条目,表1中都有一个匹配条目,但反之亦然 迄今为止的工作: 表1和表2各有一个模型,表1模型有一个field2@属性,用于查找表2模型中的相应信息 此外,我可以通过以下查询在sql级别执行此操作:将两个表的信息合并到一个Django模型中,django,django-models,Django,Django Models,我需要读取外部数据库的数据。我无法使用以下两个表修改表结构: 表1 主键 字段1 表2 主键 字段2 是否可以将这两个表合并为一个Django模型,如下所示: 型号: 主键 字段1 字段2 其他信息: 表2中条目的键是表1中条目的子集。因此,对于表2中的任何条目,表1中都有一个匹配条目,但反之亦然 迄今为止的工作: 表1和表2各有一个模型,表1模型有一个field2@属性,用于查找表2模型中的相应信息 此外,我可以通过以下查询在sql级别执行此操作: SELECT table1.key,
SELECT
table1.key,
table1.field1,
table2.field2,
FROM
table1
LEFT OUTER JOIN table2
ON table1.key=table2.key
ORDER BY table1.key ASC
===
解决方案实施详细信息在看到一些答案后更新:
从
我最终得到了两个模型:
class Model1(models.Model):
key = models.CharField(max_length=100, primary_key=True)
field1 = models.TextField()
class Meta:
managed = False
db_table = 'Table1'
def field2_value(self):
try:
return self.field2.value
except Model2.DoesNotExist:
return None
class Model2(models.Model):
key = models.OneToOneField(Model1, primary_key=True, db_column='key',
related_name='field2')
field2 = models.TextField()
class Meta:
managed = False
db_table = 'Table2'
当我问这个问题时,它并不完全是我最初的想法,但它满足了我想要的用例
此外,以下是相应的管理类:
class Model2Admin(admin.StackedInline):
model = Model2
@admin.register(Model1)
class Model1Admin(admin.ModelAdmin):
inlines = (Model2Admin,)
list_display = ('key', 'field1', 'field2_value')
# Loads the related property in one SQL call instead of one call per entry
list_select_related = ('field2',)
谢谢。我不知道我可以创建两个表的视图。如果我能修改数据库结构,我会选择你的选择 无法合并模型,因为它们是两个物理表,django模型被数据库表名绑定,因此无法执行所需操作。如果您拥有这些外部数据库表的控制权并有权修改它们,则应首先修改模式并合并数据。如果您不想或无法修改任何内容,您当前的方式是可以的。您无法合并模型,因为它们是两个物理表,django模型由数据库表名称绑定,因此您无法执行所需操作。如果您拥有这些外部数据库表的控制权并有权修改它们,则应首先修改模式并合并数据。如果您不想修改或无法修改任何内容,您当前的方式是可以的。更好的解决方案是将它们保留为两个模型,但将第二个模型的主键设置为第一个模型的OneToOneField。更好的解决方案是将它们保留为两个模型,但是第二个的主键必须是第一个的OneToOneField。您可以在sql上创建一个表视图,并在django上创建一个抽象模型。假设您有2个pyhsical模型和表 SQL代码:
CREATE OR REPLACE VIEW combine_two_model_view AS
SELECT
mt1.name as mt1_name,
mt2.name as mt2_name,
mt1.pub_date as mt1_pub_date
.
.
.
.
FROM modeltable1 mt1
LEFT JOIN modeltable2 mt2 ON mt2.id = mt1.id
ALTER TABLE combine_two_model_view
OWNER TO dbuser;
我们创建了sql视图表。现在,我们将创建一个抽象模型
在您的models.py中:
class YourModelsCombine(models.Model):
class Meta:
abstract = True
db_table = "combine_two_model_view"
mt1_name = models.CharField(max_length=100)
mt2_name = models.TextField(max_length=2000)
mt1_pub_date = models.DateTimeField("Publish Date", auto_now_add=True)
mt2_pub_date = models.DateField("Updated Date", auto_now=True)
mt1_integer = models.IntegerField(default=0)
#etc
注意:确保表视图变量名和模型变量名必须相同。最后
在admin.py中:
admin.site.register(YourModelsCombine)
您将在django管理员上看到两个表的组合
我希望这对您有所帮助您可以在sql上创建一个表视图,并在django上创建一个抽象模型。假设您有2个pyhsical模型和表 SQL代码:
CREATE OR REPLACE VIEW combine_two_model_view AS
SELECT
mt1.name as mt1_name,
mt2.name as mt2_name,
mt1.pub_date as mt1_pub_date
.
.
.
.
FROM modeltable1 mt1
LEFT JOIN modeltable2 mt2 ON mt2.id = mt1.id
ALTER TABLE combine_two_model_view
OWNER TO dbuser;
我们创建了sql视图表。现在,我们将创建一个抽象模型
在您的models.py中:
class YourModelsCombine(models.Model):
class Meta:
abstract = True
db_table = "combine_two_model_view"
mt1_name = models.CharField(max_length=100)
mt2_name = models.TextField(max_length=2000)
mt1_pub_date = models.DateTimeField("Publish Date", auto_now_add=True)
mt2_pub_date = models.DateField("Updated Date", auto_now=True)
mt1_integer = models.IntegerField(default=0)
#etc
注意:确保表视图变量名和模型变量名必须相同。最后
在admin.py中:
admin.site.register(YourModelsCombine)
您将在django管理员上看到两个表的组合
我希望这对你有所帮助它不清楚你在问什么,它可能有助于创建一个