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

时间:2018-12-05 11:26:09

标签: django python-3.x django-models django-templates django-views

我正在做类似聚会筹办者的事情。 我希望用户能够确认他们的出席,并可以选择以后取消。 我想在活动页面上显示参与者列表,并在每个用户个人资料页面上显示已确认要参加的事件列表。 我还想利用出勤来选择更新有关这些事件的电子邮件。


我有一个用于活动的模型

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 位。

我不知道如何有效地利用这些信息来

  • 在事件模板中创建参加每个事件的用户列表
  • 在用户个人资料模板中创建已确认参加的活动列表
  • 仅将更新电子邮件发送给事件的参与者(并非所有活动用户)

是否有一种出勤模式甚至是正确的解决方法?

1 个答案:

答案 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)

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

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

对于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)
)
  1. 在用户个人资料模板中创建已确认参加的活动列表

在这种情况下,我们可以通过以下方式获取事件:

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

因此,我们在这里过滤Event,以使相关的Attendance中的一个my_userattendee,而对于Attendance,{{1} }设置为is_attending

  1. 仅将更新电子邮件发送给事件的参与者(并非所有活动用户)

我们可以通过类似的查询获得正在参加的True s:

User

因此,在这里,我们获得了所有表示将参加User.objects.filter(attending__event=my_event, attending__is_attending=True)的{​​{1}}。