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

Django转账功能触发IntegrityError:user_id非空约束失败

解决「NOT NULL constraint failed: user_transactions.user_id」错误的方案

这个错误的核心原因是:保存交易记录时,Transactions模型的user字段未被赋值,但数据库要求该字段不能为NULL。以下是具体的修复步骤:

1. 修改视图的表单保存逻辑

在send视图中,表单验证通过后,不要直接保存,先创建未提交的实例,手动关联当前登录用户后再完成保存。修改后的代码如下:

@login_required(login_url='/login/')
def send(request):
    posts = Transactions.objects.filter(user=request.user)
    form = TransactionForm()
    if request.method == "POST":
        form = TransactionForm(request.POST, request.FILES)
        if form.is_valid():
            # 创建未提交到数据库的交易实例
            transaction = form.save(commit=False)
            # 关联当前登录的用户
            transaction.user = request.user
            # 最终保存完整记录
            transaction.save()
            return redirect('/success/')
        else:
            print(form.errors)
            # messages.error(request, 'Failed, Resend')
    context = {'form': form, 'posts': posts}
    return render(request, 'index_user/send-money.html', context)

2. (可选)优化模型字段定义

如果需要在后台管理界面手动创建交易时允许暂时不关联用户(业务场景不推荐,因为交易必须归属用户),可以给user字段添加null=True参数,让数据库层面暂时允许该字段为空:

class Transactions(models.Model):
    user = models.ForeignKey(CustomUser, related_name='accounts', on_delete=models.CASCADE, blank=True, null=True)
    # 其他字段保持不变

错误根源说明

  • 表单TransactionForm未包含user字段,提交表单时不会传递用户信息
  • 原代码直接调用form.save()会尝试保存user为NULL的记录,而数据库中user_id字段默认是NOT NULL约束,因此触发错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 13:24:52