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

Django模型如何创建非主键的id字段并解决E004报错?

问题解答

你遇到的报错api.GWS: (models.E004) 'id' can only be used as a field name if the field also sets 'primary_key=True'是Django内置字段校验规则触发的。Django默认会为没有显式指定主键的模型,自动创建一个名为id的自增字段作为主键,因此id是Django默认的主键保留字段名,直接定义非主键的id字段就会和默认规则冲突。

实现需求的两种方案

  • 方案一:修改自定义字段的名称(最推荐)
    不用id作为自定义字段的名称,更换为其他不冲突的名字即可,比如biz_id、record_id等,调整后的代码示例如下:
class GWS(models.Model):
    # 替换原id字段为其他名称
    biz_id = models.CharField(max_length=20)
    # 其余字段保持不变
    # Django会自动生成默认的自增id主键,不影响业务逻辑使用

该方案不需要修改主键逻辑,代码可读性更高,也不会和Django默认规则产生冲突。

  • 方案二:显式指定其他字段作为主键(需保留id字段名时用)
    如果你业务上必须使用id作为非主键字段的名称,只需要手动指定一个其他字段作为主键,覆盖Django默认的id主键规则即可,代码示例如下:
class GWS(models.Model):
    # 手动指定新的主键字段,覆盖默认的id主键
    auto_pk = models.AutoField(primary_key=True)
    # 此时就可以正常定义非主键的id字段
    id = models.CharField(max_length=20, primary_key=False)
    # 其余字段保持不变

该方案需要注意:后续使用ORM查询时,filter(id=xxx)是查询你定义的Char类型id字段,查询主键需要使用filter(pk=xxx)或者filter(auto_pk=xxx),避免逻辑混淆。

内容的提问来源于stack exchange,提问作者leauradmin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 01:51:00