Django编辑表单如何过滤Driver查询集并保留初始关联司机?
解决方案
你需要调整查询集的过滤条件,让它同时包含未关联任何车辆的司机和当前车辆已关联的司机。可以通过Django的Q对象来实现多条件的或查询:
- 首先在表单文件顶部导入
Q:
from django.db.models import Q
- 修改表单的
__init__方法:
def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) # 获取当前正在编辑的车辆实例(新增时是未保存的空实例) current_vehicle = self.instance # 构造查询集:未关联车辆的司机 + 当前车辆已绑定的司机 self.fields['driver'].queryset = vendor.drivers.select_related('user').filter( Q(vehicle__isnull=True) | Q(vehicle=current_vehicle) )
逻辑说明:
- 当是新增车辆时,
current_vehicle是未保存的Vehicle实例(无主键),Q(vehicle=current_vehicle)不会匹配任何司机,查询集只会保留未关联车辆的司机,符合需求。 - 当是编辑车辆时,
current_vehicle是已存在的车辆实例,Q(vehicle=current_vehicle)会匹配当前车辆绑定的司机,加上Q(vehicle__isnull=True)的未绑定司机,就能同时显示这两类选项,既保留了原有关联的司机,又能选择其他未绑定的司机。
内容的提问来源于stack exchange,提问作者Andi Fathul Mukminin
相关产品推荐
相关产品推荐

