【问题标题】:django event attendee list / user events list foreign key backward search chaindjango 事件参与者列表/用户事件列表外键向后搜索链
【发布时间】:2018-12-05 11:26:08
【问题描述】:

我正在制作类似于派对策划师的东西。 我希望用户能够确认他们的出席,并可以选择稍后取消。 我想在活动页面上显示与会者列表,并在每个用户个人资料页面上显示确认参加的活动列表。 我还想使用出勤率来选择更新有关这些活动的电子邮件。


我有一个活动的模型

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 [<Attendance: Christmas - Escatologist>, <Attendance: Christmas - Determinist>]>

当我想要的只是 EscatologistDeterminist 位时。

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

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

有一个出勤模型甚至是解决这个问题的正确方法吗?

【问题讨论】:

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


    【解决方案1】:

    首先,你应该真的修正你的命名法。 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. 在活动模板中创建参加每个活动的用户列表

    对于eventsEvents 列表,我们可以检查用户是否参加了所有这些活动:

    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. 仅向活动参与者(并非所有活跃用户)发送更新电子邮件

    我们可以通过类似的查询获得Users:

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

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

    【讨论】:

    • 非常感谢@willem-van-onsem,帮了大忙。
    猜你喜欢
    • 1970-01-01
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多