【问题标题】:Django: annotate() + distinct(fields) is not implementedDjango:annotate() + distinct(fields) 未实现
【发布时间】:2020-09-29 16:36:44
【问题描述】:

我有以下型号:

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

【问题讨论】:

  • 嘿,你能不能把你的代码的格式改一下,这样看真的很难。
  • @IşıkKaplan 希望现在好一点。

标签: python django postgresql


【解决方案1】:

你应该使用 .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")
                                 )

【讨论】:

  • 但理想情况下我需要整个对象,而不仅仅是特定值。
  • @popcorn 你说的理想的整个对象是什么意思? group_by 肯定会打破这个
  • @minglyu 或者我的意思是你在SELECT *... 中的所有字段,以及一些 FK 关系。
  • @minglyu 不是真的,我也收到了错误Prefetch querysets cannot use values().
猜你喜欢
  • 2016-11-29
  • 2021-01-31
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多