Python 如何在django表单中过滤查询集?

Python 如何在django表单中过滤查询集?,python,django,django-forms,Python,Django,Django Forms,我正在尝试将聊天功能添加到我的应用程序中,现在我可以将用户添加到现有聊天中,但我需要做的是筛选尚未在表单中聊天的用户。 我使用带有传递参数的django表单来过滤我的用户,但没有得到任何结果。 我的聊天模式有一个m2m字段,称为“用户”,我的用户有一个m2m字段,称为“朋友” forms.py class AddUserToChatForm(forms.ModelForm): class Meta: model = Chat fields = ('use

我正在尝试将聊天功能添加到我的应用程序中,现在我可以将用户添加到现有聊天中,但我需要做的是筛选尚未在表单中聊天的用户。 我使用带有传递参数的django表单来过滤我的用户,但没有得到任何结果。 我的聊天模式有一个m2m字段,称为“用户”,我的用户有一个m2m字段,称为“朋友”

forms.py

class AddUserToChatForm(forms.ModelForm):

    class Meta:
        model = Chat
        fields = ('users', )

    def __init__(self, chat, friends, request, *args, **kwargs):
        self.request = request
        self.chat = chat
        self.friends = friends
        super(AddUserToChatForm, self).__init__(*args, **kwargs)
        self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.request.user.friends.exclude(user__in=chat.users.all()),
                                                              widget=forms.CheckboxSelectMultiple
                                                              (attrs={'class': 'add-people-to-chat-form'}),
                                                              label='Friends:')
def add_users_to_chat(request, pk):
    chat = Chat.objects.get(pk=pk)
    friends = request.user.friends.all()
    if request.method == 'POST':
        form = AddUserToChatForm(chat, friends, request, request.POST)
        if form.is_valid():
            users_to_add = form.cleaned_data['users']
            chat.users.add(*users_to_add)
            chat.save()
            return redirect('messages')
    else:
        form = AddUserToChatForm(chat, friends, request, instance=None)
    return render(request, 'add_users_to_chat.html', {'form': form, 'chat': chat, 'friends': friends})
视图.py

class AddUserToChatForm(forms.ModelForm):

    class Meta:
        model = Chat
        fields = ('users', )

    def __init__(self, chat, friends, request, *args, **kwargs):
        self.request = request
        self.chat = chat
        self.friends = friends
        super(AddUserToChatForm, self).__init__(*args, **kwargs)
        self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.request.user.friends.exclude(user__in=chat.users.all()),
                                                              widget=forms.CheckboxSelectMultiple
                                                              (attrs={'class': 'add-people-to-chat-form'}),
                                                              label='Friends:')
def add_users_to_chat(request, pk):
    chat = Chat.objects.get(pk=pk)
    friends = request.user.friends.all()
    if request.method == 'POST':
        form = AddUserToChatForm(chat, friends, request, request.POST)
        if form.is_valid():
            users_to_add = form.cleaned_data['users']
            chat.users.add(*users_to_add)
            chat.save()
            return redirect('messages')
    else:
        form = AddUserToChatForm(chat, friends, request, instance=None)
    return render(request, 'add_users_to_chat.html', {'form': form, 'chat': chat, 'friends': friends})
编辑

看起来我的exclude语句没有效果,因为当我将其切换为filter时,集合将返回所有用户朋友

更新

我能够使用如下差异方法检索所需的用户: 鉴于:

并将其传递给表单

def __init__(self, queryset, request, *args, **kwargs):
    self.request = request
    self.queryset = queryset
    super(AddUserToChatForm, self).__init__(*args, **kwargs)
    self.fields['users'] = forms.ModelMultipleChoiceField(queryset=self.queryset,
                                                          widget=forms.CheckboxSelectMultiple
                                                          (attrs={'class': 'add-people-to-chat-form'}),
                                                          label='Friends:')
使用difference方法获取用户,但现在当我尝试提交表单时,出现以下错误:不支持在difference()之后调用QuerySet.filter()。

调试器退出视图中此行的执行:

users_to_add = form.cleaned_data['users']

由于字段是由ModelForm自动生成的,因此最好只在init中定义查询集:

def __init__(self, chat, friends, request, *args, **kwargs):
    self.request = request
    self.chat = chat
    self.friends = friends
    super(AddUserToChatForm, self).__init__(*args, **kwargs)
    self.fields['users'].queryset = self.request.user.friends.exclude(user__in=chat.users.all())

毕竟,通过使用exclude查询,我能够获得想要的结果:

鉴于:

queryset = friends.exclude(id__in=chat_users)
现在一切都按计划进行了