我有两个独立的Django应用程序,有两个不同的数据库。在APP1中,我需要来自APP2 DB中一个表的所有记录。除此之外,我的一个APP1模型有一个指向APP2模型的ForeignKey,根据文档,这是不可能的。
由于Django不支持跨多个数据库的外键关系,因此我不知道该怎么做。
官方文档:
如果您使用路由器将模型分区到不同的数据库, 由这些模型定义的任何外键和多对多关系 必须是单个数据库的内部。
这是因为参照完整性。为了维持一个 两个对象之间的关系,Django需要知道的 相关对象的主键有效。如果主键是 存储在单独的数据库中,无法轻松评估 主键的有效性。
作为一种解决方案,我曾考虑合并这两个数据库,因此这两个APPS将使用同一个数据库。但是后来我会对模型造成混乱,因为APP1只需要APP2中的一个表,并且它不需要剩余的模型和数据库表。此外,我非常确定在将这两个应用程序迁移到同一个数据库时会产生问题(冲突)。
我使用的是Django DB路由器,这是我迄今为止尝试过的:
class Car(models.Model):
_DATABASE = "cars"
color = models.TextField(max_length=1000)
...
class Employee(models.Model):
id = models.IntegerField()
car = models.ForeignKey(Car)
...
它给了我:
django.db.utils.OperationalError: (1054, "Unknow column 'car' in 'employees'")
答案 0 :(得分:1)
我认为这个问题与django无关。根据设计,DBMS不允许数据库之间的FK。也许你可以在互联网上找到一些解决方法,但可能他们不遵守最佳实践。
检查跨数据库关系部分: https://docs.djangoproject.com/en/1.9/topics/db/multi-db/
答案 1 :(得分:1)
问自己的第一个问题是否真的有必要拥有两个不同的数据库?在PHP世界中,使用相同数据库的多个应用程序非常常见,大多数人都在共享托管,托管计划只允许一个数据库。
网站有足够的流量来分割两个数据库之间的内容是非常罕见的。而且通常路由器的头部使它不值得。使用专业软件几乎总能更好地处理分片。
这不是不可能的,只是努力学习。
要做的第一件事就是更改Car
模型
class Car(models.Model):
color = models.TextField(max_length=1000)
class Meta:
managed = False
请注意,它不再引用第二个数据库,而且它不受管理。但是,您的数据库中没有这样的表格。所以你需要create a view
CREATE OR REPLACE VIEW myapp_cars AS SELECT * FROM cars.otherapp_cars
请确保使用确切的数据库和表名称以匹配现有的名称。我们只有一半。您需要创建一个触发器以插入另一个数据库。这之前已经讨论了很多次,所以我不会详细说明。实例
如果您希望这些步骤可以重现,则需要手动添加迁移。