Django models.ForeignKey("Tablename) или models.Foreignkey(Tablenamevariable)
Я смотрю на генерируемые django классы моделей, используя inspectdb.
Я заметил, что иногда строки, а иногда имена переменных вызываются на основании их появления в файле "сверху вниз".
здесь и пример
class AuthGroup(models.Model):
name = models.CharField(unique=True, max_length=150)
class Meta:
managed = True
db_table = 'auth_group'
class AuthGroupPermissions(models.Model):
id = models.BigAutoField(primary_key=True)
group = models.ForeignKey(AuthGroup, models.DO_NOTHING)
permission = models.ForeignKey('AuthPermission', models.DO_NOTHING)
class Meta:
managed = True
db_table = 'auth_group_permissions'
unique_together = (('group', 'permission'),)
class AuthPermission(models.Model):
name = models.CharField(max_length=255)
content_type = models.ForeignKey('DjangoContentType', models.DO_NOTHING)
codename = models.CharField(max_length=100)
class Meta:
managed = True
db_table = 'auth_permission'
unique_together = (('content_type', 'codename'),)
В моем случае используется устаревшая база данных (mysql).
Вопрос в следующем: Не могу ли я просто всегда использовать строковое имя таблицы вместо переменной sometimes string sometimes? Это было бы безопаснее в моем случае. Было бы... group = models.ForeignKey('AuthGroup', models.DO_NOTHING) разрешение = models.ForeignKey('AuthPermission', models.DO_NOTHING) ... не делает того же самого?
Вопрос: Могу ли я не использовать всегда строковое имя таблицы вместо иногда строковое иногда переменное?
Да: использование ForeignKey(Foo, …) может быть заменено на ForeignKey('Foo', …). Строковый литерал часто используется для ссылки на модель, которая будет определена далее в файле, так как вы не можете использовать Foo, если класс Foo еще не определен.
Но если вы хотите, вы можете использовать строковые литералы для всех ForeignKey. Вы можете ссылаться на модель с помощью 'app_name.ModelName' или просто 'ModelName', если модель определена для того же имени приложения, что и определяемая вами модель.