[英]Django - How to exclude already selected object from queryset in form?
我正在寻求有关如何解决以下问题的建议:
我有以下模型: Event > EventAttendees > EventRoster 。 每个事件都有参与者(用户),我希望将其分配给该特定事件的特定职位(EventRoster的属性)。
例如:-Event(足球/足球比赛),与会者:(鲍勃,约翰,迈克,史蒂夫),事件发球者:(鲍勃=守门员,约翰=左翼,迈克=中锋,史蒂夫=防守)
想法是要有一个活动表格,与会者中的任何人都可以分配到任何职位。 每个表单字段将代表一个职位, 如果尚未为其他职位选择该与会者 , 则可以选择该与会者 。
我的问题是,我从EventAttendees.objects.all()或.filter(event__pk = pk)中选择参与者,而没有更新此查询集以排除已经为其他职位选择的参与者。
我的目标是,如果已在表单字段(位置)中选择该与会者,则将该与会者从queryset中排除。 一旦所有与会者都分配到所有职位,基本上就将具有空的查询集。
解决此问题的最佳方法是什么? 我在所谓的链接字段中发现了相似之处,但是我想这些不适用于这种情况。 如果没有ajax,我将无法执行此操作,因为除非提交表单,否则表单上的字段值不会更改。
预先感谢您对我们的支持!
class Event(models.Model):
name = models.CharField(max_length=30, blank=True, null=True)
attendees = models.ManyToManyField(User, through='EventAttendees')
class EventAttendees(models.Model):
user = models.ForeignKey(User, related_name='user_event')
event = models.ForeignKey(Event, related_name='ice')
def __str__(self):
return self.user.username
class Meta:
unique_together = ('user','event')
class EventRoster(models.Model):
event = models.ForeignKey(Event, related_name='event_roster')
goalie = models.CharField(max_length=20, blank=True, null=True, unique=True)
center = models.CharField(max_length=20, blank=True, null=True, unique=True)
left_wing = models.CharField(max_length=20, blank=True, null=True, unique=True)
defensemen = models.CharField(max_length=20, blank=True, null=True, unique=True)
class RosterForm(forms.ModelForm):
goalie = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
center = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
left_wing = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
defensemen = forms.ModelChoiceField(queryset=EventAttendees.objects.none())
def __init__(self, *args, **kwargs):
super(RosterForm, self).__init__(*args, **kwargs)
self.fields['goalie'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['center'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['left_wing'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
self.fields['defensemen'].queryset = EventAttendees.objects.filter(event__pk=50).distinct()
class Meta:
model = EventRoster
fields = ['goalie','center','left_wing','defensemen']
我不能真正理解逻辑,除非我看到整个代码,即视图和表单,但是我认为在查询模型时, exclude()
函数会派上用场
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.