I have 2 models for 2 different databases:
Databases were created manually but it should change nothing.
class LinkModel(models.Model): # in 'urls' database
id = models.AutoField(primary_key=True)
host_id = models.IntegerField()
path = models.CharField(max_length=255)
class Meta:
db_table = 'links'
app_label = 'testapp'
def __unicode__(self):
return self.path
class NewsModel(models.Model): # in default database
id = models.AutoField(primary_key=True)
title = models.CharField(max_length=50)
link = models.ForeignKey(LinkModel)
class Meta:
db_table = 'news'
app_label = 'test'
def __unicode__(self):
return self.title
After the following code an error raises
newsItem, created = NewsModel.objects.get_or_create( title="test" )
link = LinkModel.objects.using('urls').get( id=1 )
newsItem.link = link # error!
Cannot assign "<LinkModel: />": instance is on database "default", value is on database "urls"
Why can't I use foreign key and a model for different database?
As an alternative (a bit hackish though), you could subclass ForeignKey to check for instance existance inside the right db :
then barely :
Note that it corresponds more or less to the patch that Vitaly mentions but that way does not require to patch django source-code.
After breaking my head some days, I managed to get my Foreign Key ON THE SAME BANK!
Can be made a change over the FORM to seek a FOREIGN KEY in a different bank!
First, add a RECHARGE of FIELDS, both directly (crack) my form, in function _init_
app.form.py
calling the Form from the View
app.view.py
Now, the change in the source Code DJANGO
Only fields of type ForeignKey, ManyToManyField and OneToOneField can use the 'using', so added an IF ...
django.forms.models.py
ALTER FOLLOW FILE
django.db.models.base.py
alter
for
Ready :D
Using multiple databases makes things more ´difficult.
Read: MultipleDB Django
For stuff like that to work you have to use Database Routers as described at the link as far as I know. I never used a multiple DB setup with foreign keys between them, but thats where I would get started.
The Problem
*Note: this is an extension of Vitaly Fadeev's answer
Due to a desire to keep referential integrity, Django does not allow for foreign keys which span multiple databases: https://docs.djangoproject.com/en/dev//topics/db/multi-db/#limitations-of-multiple-databases. Although this is desired in 99% of all applications, in some cases it is helpful to be able to create such an association in the ORM even if you cannot ensure referential integrity.
A Solution
I have created a Gist that uses the solution proposed here by Vitaly Fadeev wrapped as a subclass of the Django ForeignKey field. This solution does not require you to modify Django Core files but instead use this field type instead in the cases you need it.
Example Usage
The Gist
The gist is available here: https://gist.github.com/gcko/de1383080e9f8fb7d208
Copied here for ease of access:
Cross-database limitations
Django doesn't currently provide any support for foreign key or many-to-many relationships spanning multiple databases. If you have used a router to partition models to different databases, any foreign key and many-to-many relationships defined by those models must be internal to a single database.
Django - limitations-of-multiple-databases
Trouble
Same trouble. Bug in ForeignKey() class.
In validate() method.
See ticket
Bug exists in v1.2, v1.3, v1.4rc1
Solution
Try this patch to solve it.