【发布时间】:2016-03-23 13:20:40
【问题描述】:
我需要使用以下两个表读取外部数据库的数据(我无法修改表结构):
表1
- 键(主键)
- 字段1
表2
- 键(主键)
- 字段2
是否可以将这两个表组合成一个 Django 模型,如下所示:
型号:
- 键(主键)
- 字段1
- 字段2
附加信息:
Table2 中条目的键是 Table1 中条目的子集。所以对于表 2 中的任何条目,表 1 中都有匹配的条目,反之则不然
到目前为止的工作:
我对每个表(1 和 2)都有一个模型,而 Table1 模型有一个“field2”@property,用于查找 Table2 模型中的相应信息。
另外,我可以使用以下查询在 sql 级别执行此操作:
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',)
谢谢KaaN SARIKAYA for your great answer。我不知道我可以创建两个表的视图。如果我可以修改数据库结构,我会选择您的选项。
【问题讨论】:
-
不清楚你在问什么,创建minimal reproducible example可能会有所帮助
标签: django django-models