Ошибка внешнего ключа кросс-базы данных

Это моя модель первой базы данных 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 для двух баз данных. Не могли бы вы направить меня в правильном направлении. Спасибо заранее.


person Shivratna    schedule 24.04.2014    source источник
comment
Я еще не играл с несколькими базами данных и Django, но, возможно, вы пытались использовать «схемную миграцию» юга, чтобы увидеть, создает ли она таблицу для вашей модели? См. south.readthedocs.org/en/latest/tutorial/part1.html   -  person Hevlastka    schedule 24.04.2014
comment
Да, он создает таблицы в базах данных отдельно. Но я думаю, что django в настоящее время не поддерживает внешний ключ для кросс-базы данных.   -  person Shivratna    schedule 24.04.2014


Ответы (1)


Вы правы, Django в настоящее время не поддерживает отношения внешнего ключа, охватывающие несколько баз данных. Из отношений между базами данных < em>[Edit 2020: скачок версии Django]:

Если вы использовали маршрутизатор для разделения моделей по разным базам данных, любой внешний ключ и отношения «многие ко многим», определяемые этими моделями, должны быть внутренними для одной базы данных.

Это связано с ссылочной целостностью. Чтобы поддерживать отношения между двумя объектами, 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. Надеюсь, это поможет или, по крайней мере, вдохновит на лучшее решение!

person pcoronel    schedule 24.04.2014
comment
некоторые другие решения и альтернативы здесь: использовать модели django с внешними ключами в разных базах данных"> stackoverflow.com/questions/6830564/ - person Ronen Ness; 04.10.2015
comment
большое спасибо, после долгих поисков я нашел этот ответ. Есть и другие решения проблемы, но я думаю, что это самый простой способ по творческой идее! :)) - person Mohammad Reza; 03.12.2019
comment
я не знаю, почему это решение не работает для меня :( - person MSepehr; 03.04.2020
comment
позволяет ли это решение аннотировать поля с помощью синтаксиса django ORM для доступа к полям из удаленной базы данных? например Department.objects.annotate(company_name=F('company__name')) - person EnriqueH; 13.07.2020