django活动参与者列表/用户事件列表外键反向搜索链



我正在做一些类似派对策划的事情。我希望用户能够确认他们的出席,并可以选择稍后取消。我希望在事件页面上显示与会者列表,并在每个用户配置文件页面上显示确认参加的事件列表。我还想使用出席率来选择加入,以更新有关这些活动的电子邮件。


我有一个事件模型

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("nnnn" + str(attendee_list) + "nnnn")
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>]>

当我想要的只是逃脱学家决定论者位时。

我不知道的是如何将这些信息有效地用于

  • 在事件模板中创建参加每个事件的用户列表
  • 在用户配置文件模板中创建确认为参加的事件列表
  • 仅向活动参与者(并非所有活动用户(发送更新电子邮件

建立考勤模型是正确的方法吗?

首先,您应该真正修复您的命名法。related_name是反向关系的名称,因此在Event的情况下,这通常不是event,而是attendants:

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)

然后我们可以编写查询来获得信息:

  1. 在事件模板中创建参加每个事件的用户列表

对于Event的列表events,我们可以检查用户是否正在使用参加所有这些活动

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)
)
  1. 在用户配置文件模板中创建一个确认为参与的事件列表

在这种情况下,我们可以使用获得事件

Event.objects.filter(attendants__attendee=my_user, attendants__is_attending=True)

因此,这里我们过滤Events,使得相关的Attendance中的一个具有my_user作为attendee,并且对于该Attendanceis_attending被设置为True

  1. 仅向活动参与者(并非所有活动用户(发送更新电子邮件

我们可以获得使用类似查询参与的User

User.objects.filter(attending__event=my_event, attending__is_attending=True)

因此,在这里我们获得了所有表示将参加my_eventUser

最新更新