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.

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