Django:annotate()+未实现不同的(字段)

2024-09-29 19:23:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下型号:

class Village(models.Model):
    packages_required = models.IntegerField()
    .
    .

class PackageSent(models.Model):
    village = models.ForeignKey('myapp.Village')
    package_count = models.IntegerField()
    sending_user = models.ForeignKey('myapp.Users')
    sending_account_user = models.ForeignKey('myapp.Users')
    .
    .

我需要选择所有的Villages以及它们的PackageSent模型,而不仅仅是我可以根据进行分组的特定值。我构建了以下查询:

ps_query = PackageSent.objects.filter(
                                         filter_logic
                                     ).annotate(
                                         total_account_sent=Sum("package_count"), 
                                         sending_users=ArrayAgg("sender_user_id")
                                     ).distinct(
                                        "sending_account_user_id"
                                     )

Village.objects.filter(
        filter_logic
    ).order_by(
        order_by_logic
    ).annotate(
        packages_missing=F("packages_required") - Sum("packagesent__package_count"),
        users_involved=Count("packagesent__sending_account_user", distinct=True)
    ).prefetch_related(
        models.Prefetch(
            "packagesent_set", 
             queryset=ps_query, to_attr="packages_sent"
        )
    )

但是PackageSent查询未实现annotate()+distinct(fields)错误

MySQL语法中PackageSent模型所需的查询:

 SELECT 
    *,
    SUM(package_count) AS `total_account_sent`,
    GROUP_CONCAT(sending_user) AS `sending_users`
 FROM
    `myapp_packagesent` ps
 LEFT JOIN 
    `myapp_village` v ON v.id = ps.village_id
 GROUP BY 
    `sending_account_user`, 
    `village_id`
 ORDER BY
    `total_account_sent` DESC

我希望在模板中执行此操作:

{% for village in object_list %}
    .
    .
    .
    {% for package_sent in village.packages_sent %}
        .
        .
        .
    {% endfor %}
{% endfor %}

我怎样才能达到我想要的结果

使用的技术:
Django 3.0
PostgreSQL


Tags: idpackagemodelspackagescountaccountfiltermyapp
1条回答
网友
1楼 · 发布于 2024-09-29 19:23:21

您应该使用.values按所需进行分组,而不必使用distinct:

ps_query = PackageSent.objects.filter(
                                     filter_logic
                                 ).values(
                                     "sending_account_user_id", "village_id"
                                 ).annotate(
                                     total_account_sent=Sum("package_count"), 
                                     sending_users=ArrayAgg("sender_user_id")
                                 )

相关问题 更多 >

    热门问题