首页 > 解决方案 > 在 django 应用程序代码建议中使用信号

问题描述

大家好,我想根据我的模型制作每个国家/地区发送的 mail_items 数量的图表,在我的模型中,您将看到 Country_origin

我的想法是我想做另一个模型,它有 2 列“ country ”和“ mail_items_count ”,然后我想在新项目保存到“ mail_items ”时发出信号,信号将更新“ country+mail_items_count ”增加“ mail_items_count ”一个,

我还想创建一个函数来汇总“ mail_item_count ”列中的所有计数。

在我的views.py中,我想制作一个查询所有国家及其比例的视图:(我必须制作一个字典,我必须循环抛出查询中的每个对象,并将国家名称作为字典中的键,并将计数器(整数)除以 sum 函数的输出来计算每个国家/地区的比率,并附加到字典中...以发送所有国家和比率字典的响应)

模型.py

class mail_items(models.Model):
        mail_item_fid = models.OneToOneField(Mail_item_Event,on_delete=models.CASCADE)
        Event_code = models.OneToOneField(Mail_item_Event,on_delete=models.CASCADE,related_name="mail_item_event_cd")
        office_Evt_cd = models.ForeignKey(Office,on_delete=models.CASCADE, related_name='office_Ev')
        Date_Evt = models.DateTimeField()
        Country_origine = models.ForeignKey(Pays, on_delete=models.CASCADE ,related_name='paysOrigine')
        Country_destination = models.ForeignKey(Pays,on_delete=models.CASCADE,related_name='paysDestination')
        Expediteur = models.ForeignKey(Client,on_delete=models.CASCADE,related_name='expedi')
        Destinateur = models.ForeignKey(Client,on_delete=models.CASCADE,related_name='destin')

对不起,如果它这么长....

我仍然是初学者,甚至搜索了很多我无法做到这一点,你能帮我编写这部分代码还是给我发送可以帮助我编写代码的链接?

标签: pythondjango

解决方案


使用注释您可以在不创建额外模型的情况下做到这一点。它还将减少实现信号的开销

您可以直接在这样的视图中执行此操作,以获取所有国家/地区的计数:

from django.db.models import Count

countries = Pays.objects.annotate(num_emails=Count('paysOrigine'))

#example result
print(countries[0].num_emails)

或者,如果您不需要一次全部计数,您可以将属性添加到 Pays 模型:

class Pays(models.Model):
    ...

    @property
    def email_count(self):
        return self.paysOrigine_set.all().count()

推荐阅读