Django模型添加外键:应在哪个模型添加?如何操作?
Django模型外键设置方案
外键添加位置
应该在Order模型中添加外键。因为逻辑上是「一个套餐可被多个订单选择,一个订单仅对应一个套餐」的多对一(Many-to-One)关联,外键需要放在关联关系中「多」的一方(即Order模型)。
具体操作步骤
修正原模型错误:
原Order模型同时将id和selected_plan_id设为primary_key=True,这违反了Django模型「仅能有一个主键」的规则,必须去掉selected_plan_id的primary_key=True参数。替换字段为外键类型:
将原selected_plan_id的IntegerField替换为ForeignKey,关联到Plans模型,同时必须指定on_delete参数(定义关联数据被删除时的行为):models.CASCADE:删除关联套餐时,自动删除对应的订单models.PROTECT:禁止删除被订单关联的套餐(避免数据丢失)models.SET_NULL:删除套餐时,将订单的该字段设为NULL(需配合null=True)
可选:保留数据库列名:
如果希望数据库中该字段仍使用selected_plan_id作为列名,可以通过db_column参数指定,否则Django会自动生成该列名(外键字段默认会以「关联模型名_id」作为数据库列名)。
修改后的代码示例
class Plans(models.Model): id = models.IntegerField(primary_key=True) name = models.CharField(max_length=255) plan_type = models.CharField(max_length=255) class Order(models.Model): id = models.IntegerField(primary_key=True) # 推荐写法:字段名用关联模型的单数形式,方便后续查询 selected_plan = models.ForeignKey(Plans, on_delete=models.CASCADE, db_column='selected_plan_id') # 也可以直接用原字段名(不推荐): # selected_plan_id = models.ForeignKey(Plans, on_delete=models.CASCADE, db_column='selected_plan_id')
最后操作
修改完成后,执行以下命令同步数据库结构:
python manage.py makemigrations python manage.py migrate
内容的提问来源于stack exchange,提问作者ReaL_HyDRA
相关产品推荐
相关产品推荐

