Как установить внешний ключ на поле другой модели? - PullRequest
0 голосов
/ 05 июля 2019

Я хочу установить внешний ключ для поля другой модели.

Я пробовал внешний ключ to_field = 'field_name'

class Banks(models.Model):
    name = models.TextField()
    id = models.IntegerField(unique=True)

    class Meta:
        db_table = 'banks'

class Branches(models.Model):
    ifsc = models.CharField(max_length=20, null=False)
    bank_id = models.ForeignKey(Banks, to_field='id', on_delete=models.CASCADE)
    branch = models.CharField(max_length=50)```

ProgrammingError: column branches.id does not exist
LINE 1: SELECT "branches"."id", "branches"."ifsc", "branches"."bank_...

1 Ответ

0 голосов
/ 05 июля 2019

Эта проблема не вызвана внешним ключом.Ошибка происходит в модели ветвей, которая, предположительно, также имеет мета-атрибут db_table и основана на устаревшей таблице.

Вы должны определить первичный ключ для ваших моделей.Если вы этого не сделаете, Django сделает это автоматически и назовет это id.В случае вашей модели Banks вы должны установить это поле id как primary_key=True - или действительно удалить его полностью, так как это значение по умолчанию.Вам также нужно найти подходящий pk для филиалов и объявить его в поле.

Для вашего реального вопроса вам не нужно ничего делать;Django автоматически установит FK так, чтобы он указывал на PK целевой модели.

class Bank(models.Model):
    # removed `id` as that is the default PK
    name = models.TextField()

    class Meta:
        db_table = 'banks'

class Branch(models.Model):
    ifsc = models.CharField(max_length=20, primary_key=True)  # assume this is the PK
    bank = models.ForeignKey(Bank, on_delete=models.CASCADE)
    branch = models.CharField(max_length=50)

    class Meta:
        db_table = 'branches'

Обратите также внимание, поскольку это устаревшие таблицы, которые вы, вероятно, захотите добавить managed = False в оба мета-класса.И, как предлагает AKX, стиль Django делает названия моделей единичными;Вы можете сделать это, не затрагивая имя таблицы, поскольку оно объявлено явно.

...