【问题标题】:Django: Retrieve list of unique m2m combinationsDjango:检索唯一 m2m 组合的列表
【发布时间】:2022-01-25 14:14:35
【问题描述】:

我在 Django 中有以下模型架构(请注意,我省略了 ModelB 类的详细概述,因为它与问题无关)

class ModelA(Models.model):
    b = models.ManyToManyField(ModelB, blank=True)

给定一个 ModelA 对象的 QuerySet,我想接收查询集中存在的所有唯一 M2M 组合(ModelB 对象)。例如,对于以下 4 个 ModelA 对象的查询集:

| id       | b (m2m field)    | 
| -------- | ---------------- | 
| 1        | [1,2,3]          |
| 2        | [1,2]            |
| 3        | [1,2]            |
| 4        | []               |

我想返回一个类似于[[1,2,3],[1,2],[]] 的列表/查询集。在 Django 中是否有一种优雅的方法可以做到这一点?我尝试执行以下操作:`

queryset.values_list('b',flat=True).distinct() 

但这会返回整个表中存在的所有唯一 ModelB 对象的平面列表(例如:[1,2,3])。因此,我失去了 ModelB 对象在 m2m 字段中出现的组合的粒度。

【问题讨论】:

    标签: python django


    【解决方案1】:

    您可以通过ModelA.b.through 访问直通模型。从那里您可以查询该模型,该模型将具有 ModelB 和 ModelA 的字段。模型结构类似于:

    ThroughModel:
        id: int
        a_id: int
        a: ModelA
        b_id: int
        b: ModelB
    
    

    从那里您仍然需要设计查询以获取所需形状的数据。您应该可以使用SubqueryArrayAgg 实现它

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 2016-11-30
      • 2019-02-08
      相关资源
      最近更新 更多