我有一个包含这些字段的模型,虽然还有其他字段,但这是我的 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`的结果保存到我的计数器字段中?我真的很感激任何帮助。
我建议不要使用
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)
并在必要时使用
[Django-doc]:
User.objects.annotate(counter=Count('application'))
.进行计算这里注释
User
对象,注释应用程序对象意味着我们丢失
User
对象,因此只有一个我们需要链接回的电子邮件地址。将聚合存储在 Application
模型上也没有多大意义:这意味着应用程序正在存储
applicant
的 Application
已应用了多少次?
注意:通常使用
settings.AUTH_USER_MODEL
[Django-doc] 来引用用户模型比使用User
模型[Django- doc]直接。有关更多信息,您可以参阅文档参考User
模型部分。