Django:ManyToManyField保存我不检查的选择

时间:2019-10-21 02:27:10

标签: django django-queryset manytomanyfield

我正在尝试使用Django开发一个聊天应用程序,一个用户可以邀请其他一些用户到封闭的聊天室进行通信。但是我想让用户不能邀请已经在其他活动聊天室中的其他用户。因此,在创建聊天室时,我只想显示不属于任何其他活动室的用户,因此产生了以下代码。

models.py

from django.db import models
from django.utils import timezone

from .models import User, Topic # User is a very simple extension of AbstractBaseUser

class Room(models.Model):
    manager = models.ForeignKey(User, related_name='room_manage', on_delete=models.CASCADE)
    users = models.ManyToManyField(User, related_name='room_user', null=False)
    topic = models.ForeignKey(Topic, related_name='room', on_delete=models.CASCADE)
    create_time = models.DateTimeField(default=timezone.now, editable=False)
    is_active = models.BooleanField(default=True) # If the manager close the room, it becomes is_active=False

    def __str__(self):
        return "Created time: " + str(self.create_time)

views.py

from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
from django.template.response import TemplateResponse

from .forms import RoomForm
from .models import Room

@login_required
def room_add(request):
    room = Room()
    room.manager = request.user
    room_form = RoomForm(request.POST or None, instance=room)

    if room_form.is_valid():
        room_form.save()
        return redirect('room:room-list')

    return TemplateResponse(request, 'room/form.html', {'form': room_form})

forms.py

from django.forms import ModelForm, ModelMultipleChoiceField, CheckboxSelectMultiple

from .models import User, Room

class RoomForm(ModelForm):
    players = ModelMultipleChoiceField(
        widget=CheckboxSelectMultiple,
        queryset=User.objects.all().difference(
            User.objects.filter(room_user__is_active=True)
        ) # Get the complement of a subset of User who are not registered in Room with is_active=True
    )

    class Meta:
        model = Room
        fields = ['players', 'topic',]

我在这里面临的问题是,当我选择多个用户并尝试保存房间时,我发现所有用户,不仅是我选择的用户,还包括我未选择的用户,都已在房间中注册。我想问题出在RoomForm的查询集中,但是我不明白发生了什么。 我是Django的新手,所以如果我问一个简单的问题,我深表歉意。

非常感谢您的帮助!

0 个答案:

没有答案