You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django模型添加外键:应在哪个模型添加?如何操作?

Django模型外键设置方案

外键添加位置

应该在Order模型中添加外键。因为逻辑上是「一个套餐可被多个订单选择,一个订单仅对应一个套餐」的多对一(Many-to-One)关联,外键需要放在关联关系中「多」的一方(即Order模型)。

具体操作步骤

  1. 修正原模型错误:
    原Order模型同时将id和selected_plan_id设为primary_key=True,这违反了Django模型「仅能有一个主键」的规则,必须去掉selected_plan_id的primary_key=True参数。

  2. 替换字段为外键类型:
    将原selected_plan_id的IntegerField替换为ForeignKey,关联到Plans模型,同时必须指定on_delete参数(定义关联数据被删除时的行为):

    • models.CASCADE:删除关联套餐时,自动删除对应的订单
    • models.PROTECT:禁止删除被订单关联的套餐(避免数据丢失)
    • models.SET_NULL:删除套餐时,将订单的该字段设为NULL(需配合null=True)
  3. 可选:保留数据库列名:
    如果希望数据库中该字段仍使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:05:42