Django -创建了一个链接到我的PSQL的Web应用程序,但是当将数据插入到我的一个表时,由于没有ID而出错

hof1towb  于 2023-11-20  发布在  Go
关注(0)|答案(1)|浏览(131)

我有一个表,其中只有两列,即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列

jdzmm42g

jdzmm42g1#

Django不支持多列主键。

Django模型支持多列主键吗?

不支持。仅支持单列主键。
但这在实际中并不是一个问题,因为没有什么可以阻止你添加其他约束(使用unique_together模型选项或直接在数据库中创建约束),并在该级别强制唯一性。单列主键是管理界面等工作所必需的;例如,你需要一个单一的值来指定要编辑或删除的对象。
参见:https://stackoverflow.com/a/61320607/9313033
Django需要一个主键字段。如果你没有在模型声明中声明PK字段,Django将在为模型创建迁移时添加一个名为id的默认AutoField。你没有声明PK字段,所以Django需要默认值。但是默认字段不存在,因为你手动创建了表,而不是通过运行迁移。
您可以手动添加主键id字段,或者完全删除表,让Django通过运行python manage.py makemigrationspython manage.py migrate来创建它。

相关问题