Django模型:基于age设置job_exp字段遇类型错误,求解决方案
解决方案
首先,你当前代码的问题有两个:
default=set_job_exp(age)里的age是IntegerField类的实例,不是具体的数值,所以会触发类型不匹配错误;- 直接调用
set_job_exp(age)会在模型加载时就执行一次,不是每个Character实例创建时动态计算。
针对你的需求(基于age设置job_exp,且仅在创建时赋值,后续保存不修改),推荐重写save方法并添加判断逻辑:
from django.db import models from random import randint class Character(models.Model): age = models.IntegerField("Age", default=lambda: randint(18, 100)) job_exp = models.IntegerField('Job exp', blank=True, null=True) def save(self, *args, **kwargs): # 仅在实例首次创建(无主键)且job_exp未赋值时生成随机经验 if not self.pk and self.job_exp is None: self.job_exp = randint(0, self.age - 18) super().save(*args, **kwargs)
关键说明:
age的default改用lambda:避免randint(18,100)在模型加载时仅执行一次,确保每个新实例的age都是独立随机值;- 判断
not self.pk:只有当实例是新建状态(还未存入数据库,无主键)时才生成job_exp,后续修改保存不会覆盖原有值; - 允许
job_exp为null=True:确保创建时未赋值的字段能通过校验,后续由save方法填充。
如果需要在其他场景动态计算job_exp(比如修改age后同步更新),可以调整save方法的判断逻辑,比如检测age是否有变化后再更新job_exp。
内容的提问来源于stack exchange,提问作者Folium
相关产品推荐
相关产品推荐

