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