Фильтр Django не работает при использовании F() с ManyToMany

У меня есть следующий запрос:

MyModel.objects.filter(foreing_key__value=F('value'))

И он отлично работает. Но теперь у меня есть несколько сложных правил, где мне нужно оценить значение ForeignKey в зависимости от некоторых условий. Для упрощения, если я переделаю запрос так:

MyModel.objects.annotate(
  valid_value=F('foreing_key__value')
).filter(
  valid_value=F('value')
)

Не работает, когда foreing_key__value является NULL. Почему это происходит? Я думаю, что это связано с LEFT JOIN, который не применяется при использовании оператора F(), но я не знаю, как решить эту проблему.

Заранее спасибо

По какой-то причине фильтры с Q() работают при использовании имени поля. Но когда применяется F(), он оценивается как None, и Q() с равными условиями не работает, как ожидалось.

Мне нужно исправить это, используя следующий код:

MyModel.objects.annotate(
  valid_value=F('foreing_key__value')
).filter(
  Q(valid_value__isnull=False) & Q(valid_value=F('value'))
)

Поля в моделях с внешними ключами или моделях «многие-ко-многим» можно фильтровать без аннотации.

# MyModel.objects.filter(m2m_or_foreignkey__field=123)
MyModel.objects.filter(foreign_key__value=123)
Вернуться на верх