Django无法基于PickUp字段更新CashAdmin关联字段问题求助
问题排查:CashAdmin.cash_user未更新的原因
核心错误点
1. 变量名拼写错误(语法级错误)
视图的else分支里,你把变量名pick_up写成了pickup(少了下划线):
else: pickup.is_finished = True # 正确应为 pick_up.is_finished = True cash_user = pickup.quantity * 12500 if pick_up.is_finished else cash_user # 同样pickup需改为pick_up
这个错误会直接触发NameError,如果没开启Django调试模式或者忽略了报错,这部分更新逻辑会直接跳过,自然不会修改cash_user。
2. 模型导入名称错误
视图里导入的是CashADmin(大写AD),但实际模型定义的是CashAdmin(小写d):
from cash.models import CashADmin # 错误,正确应为 CashAdmin
导入错误会导致后续CashAdmin.objects.get_or_create()执行失败,无法触发cash_user的更新操作。
3. 逻辑冗余与变量未初始化问题
- 三元表达式
cash_user = pickup.quantity * 12500 if pick_up.is_finished else cash_user完全多余:当前分支是else,意味着pick_up.is_finished原本为False,现在要设为True,直接写cash_user = pick_up.quantity * 12500即可。 else分支的cash_user未初始化,如果走到该分支会触发未定义错误。
4. PickUp模型字段重复定义
PickUp模型里重复声明了user字段:
class PickUp(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) is_finished = models.BooleanField(default=False) quantity = models.IntegerField() user = models.ForeignKey(User, on_delete=models.CASCADE) # 重复定义,需删除
虽然不直接影响本次更新逻辑,但属于模型定义错误,会导致Django仅保留最后一个user字段定义。
修正后的视图代码
@admin_only def update_pickup(request, id): pick_up = PickUp.objects.get(pk=id) if pick_up.is_finished: pick_up.is_finished = False # 若业务需要,可在此添加取消完成时的金额扣减逻辑 else: pick_up.is_finished = True cash_user = pick_up.quantity * 12500 cash_admin, created = CashAdmin.objects.get_or_create(user=pick_up.user) cash_admin.cash_user += cash_user cash_admin.save() pick_up.save() return redirect('pick_up:show_pick_up')
模型修正建议
删除PickUp模型中重复的user字段定义,修正后如下:
class PickUp(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) is_finished = models.BooleanField(default=False) quantity = models.IntegerField()
内容的提问来源于stack exchange,提问作者Josh Lee
相关产品推荐
相关产品推荐

