我正在做类似聚会筹办者的事情。 我希望用户能够确认他们的出席,并可以选择以后取消。 我想在活动页面上显示参与者列表,并在每个用户个人资料页面上显示已确认要参加的事件列表。 我还想利用出勤来选择更新有关这些事件的电子邮件。
我有一个用于活动的模型:
class Event(models.Model):
title = models.CharField(max_length=50)
date_of = models.DateField(default=datetime.date.today)
date_added = models.DateTimeField(auto_now_add=True,)
added_by = models.ForeignKey(User, on_delete=models.CASCADE)
def __str__(self):
return self.title
和用于出席的模型-将作为参加者的用户链接到活动:
class Attendance(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='event')
attendee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='attendee')
is_attending = models.BooleanField(default=False)
def __str__(self):
return "%s - %s" % (self.event, self.attendee)
该事件的视图是
@login_required
def event(request, event_id):
event = get_object_or_404(Event, id=event_id)
shopping_list = event.item_set.order_by('date_added')
form = VSLForm()
attendee_list = event.event.all()
print("\n\n\n\n" + str(attendee_list) + "\n\n\n\n")
context = {'event': event, 'shopping_list': shopping_list, 'form': form}
return render(request, 'VSL/event.html', context)
我有一个视图,用于确认出席的按钮
@login_required
def is_attending(request, event_id):
"""set user as attending an event."""
event = get_object_or_404(Event, id=event_id)
attendance = Attendance(
attendee = request.user,
event = event,
is_attending = True
)
attendance.save()
return redirect('VSL:events')
和视图以取消参加会议的按钮
@login_required
def not_attending(request, event_id):
"""set user as NOT attending an event."""
event = get_object_or_404(Event, id=event_id)
attendance = Attendance.objects.get(
attendee = request.user,
event = event,
is_attending = True
)
attendance.delete()
return redirect('VSL:events')
将会有许多事件和许多用户,但并不是每个人都会去做所有事情。
事件视图中的行attendee_list = event.event.all()
提供了一个QuerySet例如<Queryset [<Attendance: Christmas - Escatologist>, <Attendance: Christmas - Determinist>]>
当我只需要 Escatologist 和 Determinist 位。
我不知道如何有效地利用这些信息来
是否有一种出勤模式甚至是正确的解决方法?
答案 0 :(得分:0)
首先,您应该真的修正您的命名法。 related_name
是反向关系的名称,因此对于event
,通常是 not Event
,但是attendants
:< / p>
class Attendance(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE, related_name='attedants')
attendee = models.ForeignKey(User, on_delete=models.CASCADE, related_name='attending')
is_attending = models.BooleanField(default=False)
def __str__(self):
return "%s - %s" % (self.event, self.attendee)
然后我们可以编写查询来获取信息:
对于events
个列表Event
中的列表,我们可以通过以下方式检查用户是否正在参加所有这些活动:
from django.db.models import Count
User.objects.filter(
attending__event__in=events,
attending__is_attending=True
).annotate(
cattendance=Count('attending')
).filter(
cattendance__gte=len(events)
)
在这种情况下,我们可以通过以下方式获取事件:
Event.objects.filter(attendants__attendee=my_user, attendants__is_attending=True)
因此,我们在这里过滤Event
,以使相关的Attendance
中的一个my_user
为attendee
,而对于Attendance
,{{1} }设置为is_attending
。
我们可以通过类似的查询获得正在参加的True
s:
User
因此,在这里,我们获得了所有表示将参加User.objects.filter(attending__event=my_event, attending__is_attending=True)
的{{1}}。