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 中创建了新查询),但它确实有效。
欢迎任何评论。
我需要在 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 中创建了新查询),但它确实有效。
欢迎任何评论。