我有两个不同的Django应用程序和两个不同的数据库。在APP1中,我需要一个表中的所有记录,该表位于APP2 DB中。除此之外,我的一个APP1模型有一个指向APP2模型的ForeignKey,而根据docs,这是不可能的。
由于Django不支持跨越多个数据库的外键关系,所以我不知道该做什么。
官方文件:
如果您曾经使用路由器将模型划分到不同的数据库,那么由这些模型定义的任何外键和多到多的关系都必须是单个数据库的内部关系。 这是因为引用的完整性。为了维护两个对象之间的关系,Django需要知道相关对象的主键是有效的。如果主键存储在单独的数据库中,则不可能轻松地评估主键的有效性。
作为一个解决方案,我已经考虑了合并这两个数据库,所以这两个应用程序将使用一个相同的数据库。但是那样的话,我会把模型搞得一团糟,因为APP1只需要一个来自APP2的表,而且它不需要剩下的模型和DB表。而且,我非常肯定,在将这两个应用程序迁移到同一个数据库时,它会产生问题(冲突)。
我正在使用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'")
发布于 2016-06-15 17:17:01
一张还是两张?
第一个问题是问你自己,真的有必要有两个不同的数据库吗?在PHP世界中,使用同一个数据库的不止一个应用程序很常见,因为大多数人都在共享托管,而托管计划只允许一个数据库。
对于一个网站来说,有足够的流量将内容分成两个数据库是非常罕见的。通常情况下,路由器的过头使得它不值得花时间。切分几乎总是更好地处理专门的软件。
是的,必须是两个!
这不是不可能的,只是很难做到。
要做的第一件事是更改Car
模型
class Car(models.Model):
color = models.TextField(max_length=1000)
class Meta:
managed = False
请注意,它不再引用第二个数据库,它是非托管的。但是你的数据库里没有这样的表。所以你需要创建视图
CREATE OR REPLACE VIEW myapp_cars AS SELECT * FROM cars.otherapp_cars
请确保使用准确的数据库和表名来匹配现有的数据库和表名。我们只走了一半。您需要创建一个触发器以插入到其他数据库中。这一点以前在这里已经讨论过很多次了,所以我不想详细说明。示例
如果您希望这些步骤是可重复的,则需要手动添加迁移。
发布于 2016-06-15 12:39:51
我认为这个问题与django无关。通过设计,DBMS不允许数据库之间的FK。也许你可以在互联网上找到一些解决办法,但很可能他们不遵守最佳实践。
查看交叉数据库关系部分:https://docs.djangoproject.com/en/3.2/topics/db/multi-db/
https://stackoverflow.com/questions/37845083
复制相似问题