Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将两个表的信息合并到一个Django模型中_Django_Django Models - Fatal编程技术网

将两个表的信息合并到一个Django模型中

将两个表的信息合并到一个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,

我需要读取外部数据库的数据。我无法使用以下两个表修改表结构:

表1

主键 字段1 表2

主键 字段2 是否可以将这两个表合并为一个Django模型,如下所示:

型号:

主键 字段1 字段2 其他信息:

表2中条目的键是表1中条目的子集。因此,对于表2中的任何条目,表1中都有一个匹配条目,但反之亦然

迄今为止的工作:

表1和表2各有一个模型,表1模型有一个field2@属性,用于查找表2模型中的相应信息

此外,我可以通过以下查询在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',)

谢谢。我不知道我可以创建两个表的视图。如果我能修改数据库结构,我会选择你的选择

无法合并模型,因为它们是两个物理表,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管理员上看到两个表的组合
我希望这对你有所帮助

它不清楚你在问什么,它可能有助于创建一个