【发布时间】: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 查询来检索信息并连接表?