2013-08-30 3 views
2

В Django docs вход для ForeignKey, он говорит:разница между использованием названия модели и модели для ForeignKey

Если вам нужно создать отношения на модели, которая еще не была определена, вы можете использовать название модели, а не сам модельный объект:

eg имя

class Car(models.Model): 
    manufacturer = models.ForeignKey('Manufacturer') 

или объект

class Car(models.Model): 
    manufacturer = models.ForeignKey(Manufacturer) 

В чем разница между этими двумя вариантами?

ответ

3

Ваш второй пример относится непосредственно к самому классу и требует, чтобы класс был определен или импортирован до его использования, в то время как первый будет использовать Django's model loading framework.

Как правило, обращение к классу прямо в порядке. В случаях, когда это не является предпочтительным или возможным (если вы, например, определяете производителя позже в том же файле или если импорт класса вызовет проблемы с циклическим импортом), синтаксис строки позволит вам установить взаимосвязь.

2

Если в models.py у вас есть это:

class Car(models.Model): 
    name = models.CharField(max_length=200) 
    manufacturer = models.ForeignKey(Manufacturer) 

class Manufacturer(models.Model): 
    name = models.CharField(max_length=200) 

Поскольку класс Manufacturer определяется послеCar, когда интерпретатор доходит до этой строки: models.ForeignKey(Manufacturer), он не может найти имя Производитель в пространстве имен, и это приведет к ошибке.

Чтобы обойти это, как правило, изменить порядок определения:

class Manufacturer(models.Model): 
    name = models.CharField(max_length=200) 

class Car(models.Model): 
    name = models.CharField(max_length=200) 
    manufacturer = models.ForeignKey(Manufacturer) 

Теперь, когда интерпретатор достигает определения внешнего ключа производителя, класс уже определен (так как его объявили перед Car класса). Другой способ сделать это; если вы не хотите перетасовывать порядок, в котором объявлены модели, следует использовать строку , которая является названием модели, к которой вы хотите обратиться. Поскольку его строка, а не имя, Python не будет вызывать ошибку.

Смежные вопросы