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

如何像使用ModelMultipleChoiceField一样使用ajax-select的AutoCompleteSelectMultipleField

报错原因

AutoCompleteSelectMultipleField原生设计未内置queryset属性,它的可选数据源默认通过提前注册的Lookup类提供,和Django原生ModelMultipleChoiceField的设计逻辑不同,因此直接调用queryset属性会抛出属性不存在的错误。

解决方案

方案一:扩展自定义字段类(完全兼容原有调用逻辑)

继承AutoCompleteSelectMultipleField新增queryset属性存储逻辑,原有调用queryset的代码不需要做任何修改,实现代码如下:

from ajax_select.fields import AutoCompleteSelectMultipleField

class QuerySetSupportAutoCompleteMultipleField(AutoCompleteSelectMultipleField):
    def __init__(self, *args, queryset=None, **kwargs):
        # 新增queryset属性存储,和原生ModelMultipleChoiceField逻辑对齐
        self.queryset = queryset
        super().__init__(*args, **kwargs)

Form中字段定义调整为自定义字段,传入对应参数即可:

# Form代码修改示例
people = QuerySetSupportAutoCompleteMultipleField(
    # 替换为你实际注册的Person对应lookup通道名称
    channel="person_lookup",
    queryset=Person.objects.exclude(is_healthy=True).filter(death_date=None),
    # 其他原有参数保持不变
    required=False
)

修改完成后,你原有测试代码people_list = form.fields['people'].queryset.values_list('id')可以直接正常运行。

方案二:直接从Lookup类获取查询集(不需要修改字段定义)

如果不想自定义字段,也可以直接调用字段内置的get_lookup()方法拿到关联的Lookup实例,再获取对应查询集,测试代码修改如下:

# 测试代码修改示例
lookup_instance = form.fields['people'].get_lookup()
people_list = lookup_instance.get_queryset().values_list('id')

注意:该方案要求你编写的对应Lookup类的get_queryset方法返回的查询集和你预期的逻辑一致,否则拿到的结果会和之前ModelMultipleChoiceField的queryset结果有差异。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:54:07