如何解析Model.objects.values("applicant", 'counter').annotate(Count("applicant"))中的applicant__count结果到counter字段?

问题描述 投票:0回答:1

我有一个包含这些字段的模型,虽然还有其他字段,但这是我的 MRE:

class Application(models.Model):     
    applicant = models.ForeignKey(User, on_delete=models.CASCADE,    to_field='email')     
    company = models.CharField(max_length=100)     
    counter = models.PositiveIntegerField(editable=False, default=0)   

我想找到表中每个申请人的申请数量,并将该值自动解析到计数器字段。在我的views.py中,我已经能够使用:

model = Application.objects.values('applicant','counter').annotate(Count("applicant"))  

返回正确的值:

{'applicant': '[email protected]', 'counter': 1, 'applicant__count': 2} {'applicant': '[email protected]', 'counter': 1, 'applicant__count': 4}

但是我无法提取 `applicant__count` 的值并将其直接解析到 models.py 中的计数器字段。

我尝试使用 update、update_or_create 方法,但无法更新模型。我还尝试了 django 信号 pre_save 和 post_save 但它们不断增加每个值。例如,一个申请人可以拥有许多工作申请,但 django 不会返回申请人的工作申请总数,而是会增加表中的所有申请。

有没有办法自动将`applicant__count`的结果保存到我的计数器字段中?我真的很感激任何帮助。

python django django-models django-views django-signals
1个回答
0
投票

我建议不要使用

counter
领域。存储聚合通常不是一个好主意:您可以在必要时确定这些。

我还尝试了 django 信号 pre_save 和 post_save 但它们不断增加每个值。

确切地说,这是存储聚合的主要原因。它需要在各种情况下进行更新:如果目标模型被删除、更新、创建等。如果查询是批量完成的,信号甚至不会运行,这使得通常几乎不可能保持counter 完美同步。

您可以删除 

counter

字段:

from django.conf import settings


class Application(models.Model):
    applicant = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE, to_field='email'
    )
    company = models.CharField(max_length=100)
    # counter = models.PositiveIntegerField(editable=False, default=0)

并在必要时使用 

.annotate(…)

 
[Django-doc]: User.objects.annotate(counter=Count('application')).
 进行计算
这里注释

User

 对象,注释应用程序对象意味着我们丢失 
User 对象,因此只有一个我们需要链接回的电子邮件地址。
将聚合存储在 

Application

模型上也没有多大意义:这意味着应用程序正在存储

applicant
Application
已应用了多少次?


注意

:通常使用 settings.AUTH_USER_MODEL

 
[Django-doc] 来引用用户模型比使用 User
 模型 
[Django- doc]
直接。有关更多信息,您可以参阅文档
参考User
模型
部分

© www.soinside.com 2019 - 2024. All rights reserved.