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

Django表单提交后修改关联模型Boolean字段的实现方案咨询

解决Django表单保存时修改关联ForeignKey模型字段的问题

问题原因

你之前尝试的form.booked_time.status = False无效,是因为form是BookingForm(ModelForm)的实例,并非Bookings模型对象,无法直接通过它访问关联的AvailableHours实例。

基础解决方案

修改视图代码,从表单处理后的Bookings实例中获取关联的AvailableHours对象,修改其status字段并保存:

@login_required()
def booking_form(request):
    form = forms.BookingForm()
    if request.method == 'POST':
        form = forms.BookingForm(request.POST)
        if form.is_valid():
            book = form.save(commit=False)
            book.user = request.user
            book.save()
            # 获取关联的可用时间段实例
            available_hour = book.booked_time
            # 将状态改为不可用
            available_hour.status = False
            available_hour.save()
            return HttpResponseRedirect(reverse('creator:login'))
    return render(request, 'account/book.html', {'form': form})

优化方案(避免并发重复预订)

如果系统存在多用户同时预订的场景,建议添加数据库事务和行锁,彻底防止同一时间段被重复预订:

from django.db import transaction

@login_required()
def booking_form(request):
    form = forms.BookingForm()
    if request.method == 'POST':
        form = forms.BookingForm(request.POST)
        if form.is_valid():
            hour_id = form.cleaned_data['booked_time'].id
            # 开启事务并锁定目标时间段记录
            with transaction.atomic():
                # 锁行操作,防止并发修改
                available_hour = AvailableHours.objects.select_for_update().get(id=hour_id)
                # 提前检查状态,避免无效操作
                if not available_hour.status:
                    form.add_error('booked_time', '该时间段已被预订')
                    return render(request, 'account/book.html', {'form': form})
                # 保存预订记录
                book = form.save(commit=False)
                book.user = request.user
                book.save()
                # 修改并保存时间段状态
                available_hour.status = False
                available_hour.save()
            return HttpResponseRedirect(reverse('creator:login'))
    return render(request, 'account/book.html', {'form': form})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 19:40:05