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

Django多车辆查询触发MultipleObjectsReturned报错,需显示用户所有车辆

解决Django MultipleObjectsReturned 错误

错误原因

你使用的get_object_or_404(Vehicle, user=request.user)底层依赖QuerySet.get()方法,这个方法要求查询结果只能返回一个对象。但当前用户关联了7辆Vehicle,触发了MultipleObjectsReturned异常,导致接口报错。

解决方案

你的需求是展示当前用户下的所有车辆并支持编辑,这里提供两种常用实现方式:

方式一:同一页面展示所有车辆的编辑表单

修改views.py:

@login_required
def vehicle_view(request):
    # 获取当前用户所有车辆
    vehicles = Vehicle.objects.filter(user=request.user)
    
    if request.method == 'POST':
        # 通过隐藏字段获取要编辑的车辆ID
        vehicle_id = request.POST.get('vehicle_id')
        try:
            target_vehicle = Vehicle.objects.get(id=vehicle_id, user=request.user)
            form = UpdateVehicleForm(request.POST, request.FILES, instance=target_vehicle)
            if form.is_valid():
                form.save()
                messages.success(request, "Vehicle Updated!")
                return redirect('vehicle_view')
            else:
                messages.error(request, "Invalid Data Provided")
        except Vehicle.DoesNotExist:
            messages.error(request, "Target vehicle not found")
    
    # 为每辆车生成对应的编辑表单
    vehicle_form_pairs = [(vehicle, UpdateVehicleForm(instance=vehicle)) for vehicle in vehicles]
    context = {'vehicle_form_pairs': vehicle_form_pairs}
    return render(request, "user/edit_vehicles.html", context)

对应模板edit_vehicles.html(需新建或修改原有模板):

{% for vehicle, form in vehicle_form_pairs %}
    <div class="vehicle-edit-section">
        <h4>Vehicle {{ vehicle.id }}: {{ vehicle.license_plate }}</h4> <!-- 替换为Vehicle模型的实际字段 -->
        <form method="POST" enctype="multipart/form-data">
            {% csrf_token %}
            <!-- 隐藏字段传递车辆ID -->
            <input type="hidden" name="vehicle_id" value="{{ vehicle.id }}">
            {{ form.as_p }}
            <button type="submit">Save Changes</button>
        </form>
    </div>
{% empty %}
    <p>You have no registered vehicles.</p>
{% endfor %}

方式二:先展示车辆列表,点击进入单个编辑页面

这种方式更符合常规用户操作流程,需拆分视图:

  1. 新增车辆列表视图(views.py):
@login_required
def vehicle_list(request):
    vehicles = Vehicle.objects.filter(user=request.user)
    return render(request, "user/vehicle_list.html", {'vehicles': vehicles})
  1. 单个车辆编辑视图(views.py):
@login_required
def vehicle_edit(request, vehicle_id):
    # 确保用户只能编辑自己的车辆
    vehicle = get_object_or_404(Vehicle, id=vehicle_id, user=request.user)
    form = UpdateVehicleForm(request.POST or None, request.FILES or None, instance=vehicle)
    
    if request.method == 'POST':
        if form.is_valid():
            form.save()
            messages.success(request, "Vehicle Updated!")
            return redirect('vehicle_list')
        else:
            messages.error(request, "Invalid Data Provided")
    
    return render(request, "user/edit_vehicle.html", {'form': form, 'vehicle': vehicle})
  1. 修改urls.py,更新路径配置:
# 替换原有vehicle_view路径,新增两个路径
path('vehicle_list/', views.vehicle_list, name='vehicle_list'),
path('vehicle_edit/<int:vehicle_id>/', views.vehicle_edit, name='vehicle_edit'),
  1. 车辆列表模板vehicle_list.html:
<h2>Your Registered Vehicles</h2>
<ul>
    {% for vehicle in vehicles %}
        <li>
            {{ vehicle.license_plate }} - {{ vehicle.model }} <!-- 替换为实际字段 -->
            <a href="{% url 'vehicle_edit' vehicle.id %}">Edit Vehicle</a>
        </li>
    {% empty %}
        <li>No vehicles registered yet.</li>
    {% endfor %}
</ul>

注意事项

  • 若保留原有edit_vehicle.html模板,确保其适配单个车辆的编辑逻辑即可。
  • 两种方式均保证用户只能访问和编辑自己的车辆,符合权限控制要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 00:50:33