【问题标题】:create django models from existing sqlite db从现有的 sqlite db 创建 django 模型
【发布时间】:2015-08-17 13:10:49
【问题描述】:

我用于创建 orm 并让 django 负责创建表。但是在我参与的项目中,我必须创建一个简单的 CRUD 应用程序作为现有数据库的前端。数据库是通过手动创建表来创建的。所以我有两个表 Table1 和 Table2,它们通过 Tables12 具有多对多关系。 Tables12 看起来像 django 通常使用 ManyToManyField 创建的表,因此它有两个字段,即两个模型的 id。所以在使用django的inspectdb之后,django就成功的根据SQLite数据库创建了模型。像 Tables12 这样的多对多表的创建方式如下(如上所述):

class Tables12(models.Model):
    table1 = models.ForeignKey(Table1)
    table2 = models.ForeignKey(Table2)

    class Meta:
        managed = False
        db_table = "Tables12"
        unique_together = (("table1_id", "table2_id"),)

尝试以下操作会给我一个错误:

>> table2 = Table2.objects.get(pk=1)
>>tables12 = Tables12.objects.filter(table2=table2)
>>tables12
OperationalError: no such column: Tables12.id

我猜 Django 的 orm 期望在创建的每个模型中都有一个 id 字段。我怎样才能绕过这种行为?有没有办法编辑表格,使它们看起来更像 django 的 orm 但表现得像现有数据库的表格?喜欢:

class Table1(models.Model):
    #pre exsiting fields
    table2 = models.ManyToManyField(Table2)

class Table2(models.Model):
    #pre existing fields
    table1 = models.ManyToManyField(Table1)

但不会破坏数据库记录,也不会从头开始创建表。

【问题讨论】:

  • 那张表上你的主键的名字是什么?我假设您的数据库不使用 ID 作为 PK。 Django 为您提供了使用“primary_key=True”标记哪个字段是主键的可能性。 docs.djangoproject.com/en/1.8/ref/models/fields/…。但是不确定这是否是您需要的。
  • 这就是Tables12(多对多关系表)在创建时没有主键的问题。所以很自然地,inspectdb 没有创建一个。我怎样才能绕过它
  • 在这种情况下运行alter table sql,创建主键并将其设置为自动增量。
  • 所以没有其他方法可以做到这一点,因为这意味着改变现有的数据库模式,我认为这是不可能的。我应该改用烧瓶和 SqlAlchemy 吗?
  • 但这是 RDBMS 理论。如果它们实际上没有连接,您将如何将这些表链接在一起?您将如何编写 sql 查询来检索信息并连接表?

标签: django sqlite


【解决方案1】:

您可以删除Tables12 模型,并将db_table 参数指定给ManyToManyField

class Table1(models.Model):
    tables2 = models.ManyToManyField(Table2, db_table='Tables12')

您仍然无法直接查询Tables12 模型(它仍然存在并且有一个id 字段),但这将允许您使用Django 为ManyToManyField 生成的JOINs:

table1 = Table1.objects.get(pk=1)
tables2 = table1.tables2.all()

这仍然不允许您使用 Django 写入连接表,但它允许您使用其中的数据。如果可能的话,我强烈建议添加主键。

【讨论】:

  • 谢谢。这会起作用吗?何时创建新记录?例如 new_table1 = Table1() new_table1.save() #new_table1.id = 54 new_table2 = Table2() new_table2.save() #new_table2.id = 83 new_table1.tables2.add(new_table2) 代码应该将记录添加到 Tables12 ( 54, 83) 仅此而已。
  • "这仍然不允许您使用 Django 写入连接表。"
  • 嗯。谢谢你。这个项目使用了 SqlAlchemy。正如我从教程中看到的那样,它可以在没有主 ID 的 ManyToMany 字段中生成中间表
  • 未来版本(很可能是 1.9)将支持复合主键。这将允许几乎相同的行为。
  • 它没有用...我添加了多对多字段,但是当我这样做时,tables2 = table1.tables2.all() 抛出了 no attribute with name tables2 的错误
猜你喜欢
  • 2011-01-09
  • 1970-01-01
  • 2012-12-21
  • 1970-01-01
  • 2013-09-25
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 2021-05-01
相关资源
最近更新 更多