список участников django событий / список пользовательских событий внешний ключ цепочка обратного поиска - PullRequest
0 голосов
/ 05 декабря 2018

Я делаю что-то вроде планировщика вечеринок.Я хочу, чтобы пользователи могли подтвердить свою посещаемость с возможностью отмены позже.Я хочу отобразить список участников на странице событий и список событий, подтвержденных для посещения на каждой странице профиля пользователя.Я также хочу использовать посещаемость, чтобы получать уведомления об этих событиях по электронной почте.


У меня есть Модель для мероприятия:

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>]>

Когдая хочу только эскатолог и детерминист бит.

Что я не знаю, так это как с пользой использовать эту информацию для

  • создать список пользователей, посещающих каждое событие в шаблоне события
  • создать список событий, подтвержденных как посещающих в шаблоне профиля пользователя
  • отправлять электронные письма только посетителям событий (не всем активным пользователям)

Является ли модель посещаемости даже правильным способом?

1 Ответ

0 голосов
/ 05 декабря 2018

Прежде всего, вы должны действительно исправить вашу номенклатуру.related_name - это имя отношения в обратном порядке, поэтому обычно это , а не event в случае Event, но attendants:

class Attendance(models.Model):
    event = models.ForeignKey(Event, on_delete=models.CASCADE, <b>related_name='attedants'</b>)
    attendee = models.ForeignKey(User, on_delete=models.CASCADE, <b>related_name='attending'</b>)
    is_attending = models.BooleanField(default=False)

    def __str__(self):
        return "%s - %s" % (self.event, self.attendee)

МыЗатем можно написать запросы для получения информации:

  1. создать список пользователей, посещающих каждое событие в шаблоне события

для списка events из Event sмы можем проверить, посещает ли пользователь все эти события с помощью:

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, is_attending устанавливается на True.

отправка обновлений по электронной почте только участникам событий (не всем активным пользователям)

Мы можем получить User s, которые посещают с похожим запросом:

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

Таким образом, здесь мы получаем все User, которые сказали, что они посетят my_event.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...