Нет, если вы отфильтруете отношения «один ко многим» или «многие ко многим», это создаст JOIN со связанной таблицей, и если несколько объектов совпадут, то это приведет к получению одного и того же значения несколько раз.
Вы можете использовать .distinct(..)
(Django -do c) для фильтрации дублирующихся строк.
objs = objs.filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
)<b>.distinct()</b>
Еще более проблематично c в том, что если вы добавите аннотацию, то это может привести к тому, что счетчик также будет считать дубликаты. Вы можете добавить distinct=True
[Django -doc] к выражению Count(..)
, чтобы предотвратить это:
objs = objs.annotate(
num_line=Count('lns'<b>, distinct=True</b>)
).filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
).distinct()