Django - Создано веб-приложение, которое связано с моим PSQL, но при вставке данных в одну из моих таблиц выдает ошибку отсутствия ID
У меня есть таблица, в которой есть только два столбца: exercise_id и muscle_id
create table if not exists exercise_muscle(
exercise_id INT not null,
muscle_id INT not null,
primary key (exercise_id, muscle_id),
foreign key (exercise_id) references exercise(exercise_id),
foreign key (muscle_id) references muscle(muscle_id)
);
Но когда я пытаюсь вставить в него данные с моделью, показанной ниже
class ExerciseMuscle(models.Model):
exercise = models.ForeignKey('Exercise', on_delete=models.CASCADE)
muscle = models.ForeignKey('Muscle', on_delete=models.CASCADE)
class Meta:
db_table = 'exercise_muscle'
unique_together = ('exercise', 'muscle')
Я получаю эту ошибку, когда он пытается вернуть exercise_muscle.id, который не существует
django.db.utils.ProgrammingError: column exercise_muscle.id does not exist
LINE 1: ...xercise_id", "muscle_id") VALUES (1, 1) RETURNING "exercise_...
Я также проверил свой django dbshell, и он выглядит нормально
\d exercise_muscle
Table "public.exercise_muscle"
Column | Type | Collation | Nullable | Default
-------------+---------+-----------+----------+---------
exercise_id | integer | | not null |
muscle_id | integer | | not null |
Indexes:
"exercise_muscle_pkey" PRIMARY KEY, btree (exercise_id, muscle_id)
Foreign-key constraints:
"exercise_muscle_muscle_id_fkey" FOREIGN KEY (muscle_id) REFERENCES muscle(muscle_id)
Проверил свою psql-таблицу, в ней нет столбца id
Первичные ключи с несколькими колонками не поддерживаются Django.
Поддерживают ли модели Django первичные ключи с несколькими столбцами?
Нет. Поддерживаются только одноколоночные первичные ключи.
Но на практике это не является проблемой, поскольку ничто не мешает добавить другие ограничения (используя модель unique_together или создав ограничение непосредственно в базе данных), и обеспечить уникальность на этом уровне. Первичные ключи с одним столбцом необходимы для работы таких вещей, как интерфейс администратора; например, вам нужно единственное значение для указания объекта для редактирования или удаления.
Также см: https://stackoverflow.com/a/61320607/9313033
Django ожидает наличие одного поля первичного ключа. Если вы не объявите PK-поле в объявлении модели, Django добавит автополе по умолчанию под названием id
при создании миграции для модели. Вы не объявили PK-поле, поэтому Django ожидает поле по умолчанию. Но поля по умолчанию не существует, поскольку вы создали таблицу вручную, а не запустили миграции.
Либо добавьте поле первичного ключа id
вручную, либо полностью отбросьте таблицу и позвольте Django создать его, выполнив python manage.py makemigrations
, а затем python manage.py migrate
.