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', если модель определена для того же имени приложения, что и определяемая вами модель.

Вернуться на верх