Чем они отличаются?Есть ли какая-то особая цель написания, подобного этому, или они оба одинаковые?
Они оба приводят к одной и той же ссылке да.Позже строка будет «разрешена», и в конечном итоге ForeignKey
будет указывать на модель Author
.
Однако использование строк иногда является единственным способом сделать ссылки, если модели, на которые вы нацеливаетесьдолжны быть определены еще.Например, в случае циклической ссылки.
Представьте, например, что вы определяете отношения как:
class Author(models.Model):
name = models.CharField(max_length=128)
favorite_book = models.ForeignKey(<s>Book</s>, null=True, on_delete=models.SET_NULL)
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
Здесь Book
относится к Author
и Author
относится к Book
.Но поскольку класс Book
не создается во время создания ForeignKey
, это даст NameError
.
. Мы не можем определить Author
после того, как мы определили Book
,с тех пор мы обращаемся к Author
до его создания (и, таким образом, это снова даст NameError
).
Однако мы можем использовать здесь строки, избегая циклической ссылки, например:
class Author(models.Model):
name = models.CharField(max_length=128)
favorite_book = models.ForeignKey(<b>'Book'</b>, null=True, on_delete=models.SET_NULL)
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
При использовании строки это нормально для интерпретатора Python, так как вы не используете идентификатор, который еще не определен, и Django затем, когда модели будут загружены, заменит строки со ссылкой насоответствующая модель.
Документация на ForeignKey
[Django-doc] :
Если вам нужно создать отношение к модели, которая еще не была определена , вы можете использовать имя модели, а не сам объект модели (...)
Если модельопределенный в другом приложении, вы можете обратиться к нему с помощью app_name.ModelName
.