Foreign key from one app into another in Django
Question:
I’m wondering if it’s possible to define a foreign key in a models.py file in Django that is a reference to a table in another app?
In other words, I have two apps, called cf and profiles, and in cf/models.py I have (amongst other things):
class Movie(models.Model):
title = models.CharField(max_length=255)
and in profiles/models.py I want to have:
class MovieProperty(models.Model):
movie = models.ForeignKey(Movie)
But I can’t get it to work. I’ve tried:
movie = models.ForeignKey(cf.Movie)
and I’ve tried importing cf.Movie at the beginning of models.py, but I always get errors, such as:
NameError: name 'User' is not defined
Am I breaking the rules by trying to tie two apps together in this way, or have I just got the syntax wrong?
Answers:
OK – I’ve figured it out. You can do it, you just have to use the right import
syntax. The correct syntax is:
from prototype.cf.models import Movie
My mistake was not specifying the .models
part of that line. D’oh!
According to the docs, your second attempt should work:
To refer to models defined in another application, you must instead explicitly specify the application label. For example, if the Manufacturer model above is defined in another application called production, you’d need to use:
class Car(models.Model):
manufacturer = models.ForeignKey('production.Manufacturer')
Have you tried putting it into quotes?
It is also possible to pass the class itself:
from django.db import models
from production import models as production_models
class Car(models.Model):
manufacturer = models.ForeignKey(production_models.Manufacturer)
I’m wondering if it’s possible to define a foreign key in a models.py file in Django that is a reference to a table in another app?
In other words, I have two apps, called cf and profiles, and in cf/models.py I have (amongst other things):
class Movie(models.Model):
title = models.CharField(max_length=255)
and in profiles/models.py I want to have:
class MovieProperty(models.Model):
movie = models.ForeignKey(Movie)
But I can’t get it to work. I’ve tried:
movie = models.ForeignKey(cf.Movie)
and I’ve tried importing cf.Movie at the beginning of models.py, but I always get errors, such as:
NameError: name 'User' is not defined
Am I breaking the rules by trying to tie two apps together in this way, or have I just got the syntax wrong?
OK – I’ve figured it out. You can do it, you just have to use the right import
syntax. The correct syntax is:
from prototype.cf.models import Movie
My mistake was not specifying the .models
part of that line. D’oh!
According to the docs, your second attempt should work:
To refer to models defined in another application, you must instead explicitly specify the application label. For example, if the Manufacturer model above is defined in another application called production, you’d need to use:
class Car(models.Model):
manufacturer = models.ForeignKey('production.Manufacturer')
Have you tried putting it into quotes?
It is also possible to pass the class itself:
from django.db import models
from production import models as production_models
class Car(models.Model):
manufacturer = models.ForeignKey(production_models.Manufacturer)