Django - 查找丢失的活动邀请

Django - Find missing invitations for an event

我需要在 django 上挑选社区的大脑。我仍在学习,层抽象是我的主要挑战(与 PHP/SQL 脚本相比)

这是我的模型的摘录:

一个非常简单的联系人,但是有一个“级别”(比如基本的,黄金的,...)

class customer(models.Model):
    created_date = models.DateTimeField(auto_now_add = True, editable = False)
    modified_date = models.DateTimeField(auto_now = True, editable = False)

    surname = models.CharField(max_length=200)
    lastname = models.CharField(max_length=200)
    fk_level = models.ForeignKey(level, on_delete=models.CASCADE)
[...]

需要邀请客户(任意数量)参加的活动:

class event(models.Model):
    created_date = models.DateTimeField(auto_now_add = True, editable = False)
    modified_date = models.DateTimeField(auto_now = True, editable = False)

    eventdate =  models.DateField('Date de la soirée')
    fk_customer = models.ManyToManyField(customer, blank=True)
[...]

客户的活动邀请。

class invite(models.Model):
    created_date = models.DateTimeField(auto_now_add = True, editable = False)
    modified_date = models.DateTimeField(auto_now = True, editable = False)

    fk_customer = models.ForeignKey(customer, on_delete=models.CASCADE)
    fk_event = models.ForeignKey(event, on_delete=models.CASCADE)
[...]

等级说明,根据客户等级发送邀请数量。

class level(models.Model):
    created_date = models.DateTimeField(auto_now_add = True, editable = False)
    modified_date = models.DateTimeField(auto_now = True, editable = False)

    name = models.CharField(max_length=200)
    eventinvites = models.IntegerField(default=2)
[...]

我不想(并且可能不知道如何)在将客户添加到活动后立即创建邀请。因为我需要管理删除客户,还需要管理删除邀请。

所以我需要的是,对于每个活动,根据客户级别检查我们是否有足够的邀请。

如果没有“基本”客户参加活动的“邀请”,我需要列出“eventinvites”(2) 个邀请(一旦我知道有多少,我就可以管理创建)。 如果只有1个邀请,那么我只需要列出1个。如果超过1个,那么我什么都不用做。

在标准 python 代码中,我可能会遍历事件,然后针对每个事件,以及针对每个被邀请的客户,遍历邀请并检查我有多少匹配项客户和事件。如果少于“eventinvites”,我会将事件/客户对添加到“待办事项”列表中。

类似

1   missing_invites = []
2   for event in Events:
3      for invited_customer in (Customers where event.fk_customer):
4           invite_count = 0
5           for invites in (Invites where invite.fk_customer==invited_customer and
6                           invite.fk_event == event.id):
7               invite_count += 1
8           if invite_count < event.fk_customer.fk_level.eventinvites:
9               missing_invites += (event, invited_customer)

在 Django 中,我可以在上下文中创建包含事件、邀请和客户的视图。 我可以遍历事件(第 2 行),然后过滤客户(第 3 行),并列出已经创建的邀请。

views.py:

class MissingInvitesView(PermissionRequiredMixin, ListView):
    model = invite
    template_name = 'missing.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context["Cards"] = event.objects.all() #because it's easier 
                                               to understand
        context["Events"] = event.objects.all()
        context["Customers"] = customer.objects.all()

和missing.html:

    {% for event in Events %}
        {% for customer in event.fk_customer.all %}
            {% with eventInvite=Invites|matchingEvent:event.id %}
                {% for customereventInvite in eventInvite|matchingCustomer:customer.id %}
                    <br>{{ customereventInvite }}
                {%endfor%}
            {%endwith%}
        {% endfor%}
    {%endfor%}

有了这个,我可以获得现有的邀请列表。但是我想不出一种方法来计算这些并在缺少时显示一些东西。

我仍在使用通用 (class) 视图,因为它更容易。我应该开始学习标准 (def) 视图吗?有用吗?

非常感谢您的帮助。 Jm

我终于找到了如何完成我的挑战。

Missing.html 已更新为:

{% for event in Events %}
    {% for customer in event.fk_customer.all %}
        {% with eventInvites=Invites|matchingEvent:event.id %}
            {% for newInvite in eventInvites|MissingInvitesFor:customer.id %}
                        <br>New Invite required
            {%endfor%}
        {%endwith%}
    {% endfor%}
{%endfor%}

和我的 custom_tags:

@register.filter(name="matchingEvent")
def matchingEvent(invites, event_id):
    return invites.filter(fk_event=event_id).all()


@register.filter(name="MissingInvitesFor")
def MissingInvitesFor(invites, current_customer_id):
    current_customer = customer.objects.filter(id = current_customer_id).first()
    customer_level = current_customer.fk_userlevel
    required_invites = int(customer_level.eventinvites)
    existing_invites = invites.filter(fk_customer=current_customer_id).count() 
    return range(required_invites - existing_invites)

它可能不是最高效或最干净的(因为我在 custom_tags 中创建了新查询),但它确实有效。

欢迎任何评论。