在连接具有n到n关系的表之前,如何限制表中的记录,以避免django ORM中的重复记录?

在连接具有n到n关系的表之前,如何限制表中的记录,以避免django ORM中的重复记录?,django,filter,orm,jointable,prefetch,Django,Filter,Orm,Jointable,Prefetch,延长我以前的工作时间。我有四张桌子: A <--- Relation ---> B ---> Category 现在我需要根据B中的一些字段过滤强度: A.objects.values( 'id', 'Relation_set__B__Category_id' ).filter( Relation_set__B__BType=type_filter ).annotate( AcIntensity=Sum(F('Relation_set__Intensi

延长我以前的工作时间。我有四张桌子:

A <--- Relation ---> B ---> Category
现在我需要根据B中的一些字段过滤强度:

A.objects.values(
    'id', 'Relation_set__B__Category_id'
).filter(
    Relation_set__B__BType=type_filter
).annotate(
    AcIntensity=Sum(F('Relation_set__Intensity'))
).aggregate(
    Max(F('AcIntensity'))
)['AcIntensity__max']
但是,我需要避免由于表联接而导致的重复,这会扰乱计算。(除了定义过滤的字段之外,我不需要B中的任何字段)
有没有一种方法可以使用Django ORM实现这一点

更新
我认为我需要的是在查询数据库之前限制关系表中的记录(基于B过滤器)。我该怎么做?

(可能使用预回迁和预回迁?

最后我使用了。
你可以在这里找到更多的细节。 因此,最终的代码是:

result = A.objects.values(
    'id', 'Relation_set__B__Category_id'
).annotate(
    AcIntensity=Sum(
        Case(
            When(
               q_statement_for_filter,then=F('Relation_set__Intensity'),
            ),
            default=0,
            output_field=FloatField()
        )
    )
).exclude(
    AcIntensity=0
).aggregate(
    Max(F('AcIntensity'))
)['AcIntensity__max']

请注意,“q_statement_for_filter”不能是空的q()。

是否可能与筛选的预取有关?
result = A.objects.values(
    'id', 'Relation_set__B__Category_id'
).annotate(
    AcIntensity=Sum(
        Case(
            When(
               q_statement_for_filter,then=F('Relation_set__Intensity'),
            ),
            default=0,
            output_field=FloatField()
        )
    )
).exclude(
    AcIntensity=0
).aggregate(
    Max(F('AcIntensity'))
)['AcIntensity__max']