【问题标题】:Cross Database foreign key error跨数据库外键错误
【发布时间】:2014-06-09 17:42:52
【问题描述】:

这是我的第一个数据库 DB1 模型:

     from django.db import models 

     class Company(models.Model): 

          name = models.CharField(max_length=100, null=True)
          address = models.TextField(max_length=200, null=True)
          website = models.CharField(max_length=200, null=True)
          conatct_no = models.CharField(max_length=20, null=True)
          email = models.EmailField(max_length=20, null=True)
          logo = models.FileField(upload_to='logo/', blank=True, null=True)
          created = models.DateTimeField('company created', auto_now_add=True)
          updated = models.DateTimeField('company updated', auto_now=True, null=True)
          def __unicode__(self):  # Python 3: def __str__(self):
                return self.name

第二个数据库Db2的模型:

    from django.db import models

    from leavebuddymaster.models import Company

    class Department(models.Model): 
       company = models.ForeignKey(Company)
       department_name = models.CharField(max_length=50, null=True)
       created = models.DateTimeField('department created', auto_now_add=True)
       updated = models.DateTimeField('department updated', auto_now=True, null=True)
       def __unicode__(self):  # Python 3: def __str__(self):
            return self.department_name

现在当我打开部门表时,它给了我一个错误:

      ProgrammingError at /admin/leavebuddyapp/department/
      (1146, "Table 'leavebuddy_master.leavebuddyapp_department' doesn't exist")

我已经为这两个数据库正确地完成了 settings.py 中的所有设置。你能指导我正确的方向吗?提前谢谢。

【问题讨论】:

  • 我还没有玩过多个数据库和 Django,但是您是否尝试过使用 souths 'schemamigration' 来查看它是否为您的模型创建了表?见south.readthedocs.org/en/latest/tutorial/part1.html
  • 是的,它确实在数据库中分别创建了表。但我猜django目前不支持跨数据库的外键。

标签: django foreign-keys cross-database


【解决方案1】:

你说得对,Django 目前不支持跨多个数据库的外键关系。 来自Cross-database relations[Edit 2020: Django version bump]

如果您使用路由器将模型分区到不同的数据库,则这些模型定义的任何外键和多对多关系必须在单个数据库内部

这是因为参照完整性。为了维护两个对象之间的关系,Django 需要知道相关对象的主键是有效的。如果主键存储在单独的数据库中,无法轻松评估主键的有效性

我想出一个你可以尝试的解决方案(尽管它可能会带来其他问题):

from leavebuddymaster.models import Company

class Department(models.Model): 
    company_id = models.IntegerField()
    
    @property
    def company(self):
        return Company.objects.get(pk=self.company_id)

这使您可以像在示例中通常那样引用Department.company。设置它只是Department.company_id = Company.pk 的问题。希望它有所帮助,或者至少能激发出更好的解决方案!

【讨论】:

  • 这里有一些其他解决方案和替代方案:stackoverflow.com/questions/6830564/…
  • 非常感谢,经过长时间的搜索,我找到了这个答案。这个问题还有另一种解决方案,但我认为这是一个创意最简单的方法! :))
  • 我不知道为什么这个解决方案对我不起作用:(
  • 此解决方案是否允许使用 django ORM 语法注释字段以访问远程数据库中的字段?例如Department.objects.annotate(company_name=F('company__name'))
猜你喜欢
  • 2014-03-30
  • 2018-11-08
  • 2014-10-22
  • 2015-03-02
  • 1970-01-01
  • 2012-07-21
  • 2011-04-09
  • 2015-03-17
  • 2017-08-11
相关资源
最近更新 更多