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

Django - Created a web app which is linked to my PSQL, but when inserting data to one of my tables gives error for no ID

提问人:dani r 提问时间:11/13/2023 最后编辑:dani r 更新时间:11/13/2023 访问量:24

问:

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

python django 数据库 psql

评论

0赞 Chris 11/13/2023
请阅读为什么我不应该上传代码/数据/错误的图片?您可以编辑您的问题并将图像替换为代码块。最简单的方法是将代码作为文本直接粘贴到您的问题中,然后选择它并单击代码块按钮。

答:

1赞 CoffeeBasedLifeform 11/13/2023 #1

Django 不支持多列主键。

Django 模型是否支持多列主键?

不。仅支持单列主键。

但这在实践中不是问题,因为没有什么可以阻止的 您无需添加其他约束(使用 unique_together 模型 选项或直接在数据库中创建约束),以及 在该级别上强制执行唯一性。单列主键是 管理界面等需要工作;例如,您需要 用于指定要编辑或删除的对象的单个值。

另请参阅:https://stackoverflow.com/a/61320607/9313033

Django 需要一个主键字段。如果你没有在模型声明中声明 PK 字段,Django 将添加一个默认的 AutoField 调用,在为模型创建迁移时调用。你没有声明 PK 字段,所以 Django 需要默认值。但默认字段不存在,因为您是手动创建的表,而不是通过运行迁移。id

要么自己手动添加主键字段,要么完全删除表,让 Django 通过运行后跟 .idpython manage.py makemigrationspython manage.py migrate