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
相关产品推荐
相关产品推荐

